iOS 8 UIActivityViewController和UIAlertControllerbutton文本颜色使用窗口的tintColor

在iOS 8中,似乎UIAlertController (特别是操作表types)上的button以及UIActivityViewController上的button从主窗口的tintColor中获取它们的颜色。

我怎样才能改变button文字的颜色? 我试过使用这样的外观代理:

 [[UIButton appearanceWhenContainedIn:[UIActivityViewController class], nil] setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; 

但它没有效果。 我的窗口的tintColor是白色的,所以UIActivityViewControllerbutton上的文字也是白色的,不能被看到。 改变我的窗口的tintColor解决了这个问题,但它弄乱了应用程序的其余部分。

看到我的UIActivityViewController的屏幕截图,底部有白色文本的白色取消button:

UIActivityViewController与白色取消按钮文本

同样的事情适用于UIActionSheet(是的,我知道它已被弃用)和UIAlertController与actionSheettypes。

我怎样才能使这些窗口上的文本可读,而无需改变整个应用程序的tintColor? 提前致谢!

除了为应用程序定义的全局色调颜色之外,每个视图控制器还允许您为该控制器覆盖色调颜色。 在这种情况下,最好的办法是在初始化之后,但在呈现之前,在你的UIActivityViewController上设置tintColor。

 UIActivityViewController *activityController = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:activities]; //Set the tint color on just the activity controller as needed here before presenting [activityController.view setTintColor:[UIColor blueColor]]; [self presentViewController:activityController animated:YES completion:nil]; 

如果你在应用程序中做了很多事情,你可以使用子类或类别来避免代码重复。

这对我工作与UIAlertController

 [[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blackColor]]; 

在iOS 9中,我可以通过设置呈现UIActivityViewController的视图来解决这个问题。 不幸的是,在iOS 10 / Xcode 8中,这停止了我的工作。 我正在尝试着色共享面板,以便取消button不会有白色,看不见的文字。

我发现在iOS 10中唯一的工作是UIButton.appearance().tintColor = UIColor.red 。 你可以在应用程序委托中全局设置这个(但是这个也是你的导航栏button等的颜色,所以你必须手动去着色另一种颜色)。 你也可以在视图中本地设置它,但是因为它实际上是一个全局主题,可以应用到所有的Buttontypes,所以如果你不想让下一个视图拾取它,那么你必须把它设置回另一个颜色。

因此,在我初始化UIActivityViewController之后,但在呈现之前,通过添加上面的线和我的色彩颜色,我能够以“hackish”方式将其作为色调工作,只是我的ActivityControllerbutton。 然后,我在ActivityController演示函数的完成处理程序中将色调设置回我喜欢的颜色(白色)。

例如:/ /图像共享让图像= UIImage(命名为:“图像”)

  // set up activity view controller let imageToShare = [ image! ] let activityViewController = UIActivityViewController(activityItems: imageToShare, applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = self.view UIButton.appearance().tintColor = UIColor.red // present the view controller self.present(activityViewController, animated: true, completion: { DispatchQueue.main.async { UIButton.appearance().tintColor = UIColor.white } }) 

iOS 11

  let activityVC = UIActivityViewController(activityItems: objectsToShare, applicationActivities: nil) activityVC.popoverPresentationController?.sourceView = self.view //Set your activity view controller's appearance UIButton.appearance().tintColor = .blue //Set back to default UIButton appearance self.present(activityVC, animated: true, completion: { DispatchQueue.main.async { UIButton.appearance().tintColor = nil } }) 

为我工作 – 先备份当前色调

 //COLCSocialManager.showShareActivityViewController(fromVC: aViewController) class func showShareActivityViewController(fromVC vc: UIViewController){ //let textToShare = "TAXI RANKS LONDON. New iOS app for tourists and cabbies. Check it out its free. http://buff.ly/2kNMhyU" let textToShare = "TAXI RANKS LONDON. New iOS app for tourists and cabbies. Check it out its free." let linkToShare = "http://buff.ly/2kNMhyU" //on FB the link is converted let activityItems: [Any] = [ textToShare, linkToShare ] let activityViewController = UIActivityViewController(activityItems: activityItems, applicationActivities: nil) activityViewController.popoverPresentationController?.sourceView = vc.view // so that iPads won't crash // exclude some activity types from the list (optional) //activityViewController.excludedActivityTypes = [ UIActivityType.airDrop, UIActivityType.postToFacebook ] let buttonTintBackup = UIButton.appearance().tintColor UIButton.appearance().tintColor = UIColor.red // present the view controller vc.present(activityViewController, animated: true) { UIButton.appearance().tintColor = buttonTintBackup } }