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:
同样的事情适用于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 } }