IOS 8では、UIAlertController
(具体的にはアクションシートタイプ)のボタンとUIActivityViewController
のボタンは、メインウィンドウのtintColorから色を取得するようです。
ボタンのテキストの色を変更するにはどうすればよいですか?私はこのような外観プロキシを使用してみました:
[[UIButton appearanceWhenContainedIn:[UIActivityViewController class], nil] setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
しかし、効果はありません。私のウィンドウのtintColorは白なので、UIActivityViewControllerボタンのテキストも白であり、見ることができません。ウィンドウのtintColorを変更するとこの問題は解決しますが、アプリの残りの部分が台無しになります。
UIActivityViewController
のスクリーンショットをご覧ください。下部に白いテキストが付いた白いキャンセルボタンがあります。
同じことがUIActionSheet(はい、廃止されていることは知っています)とactionSheetタイプのUIAlertControllerにも当てはまります。
アプリ全体のtintColorを変更せずに、これらのウィンドウのテキストを読みやすくするにはどうすればよいですか?前もって感謝します!
アプリケーションに定義されているグローバルな色合いに加えて、各View Controllerでは、そのコントローラーだけの色合いをオーバーライドできます。この場合、最善の策は、初期化後、表示する前に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 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
}
})
IOS 9では、UIActivityViewControllerを表示するビューに色を付けることでこれを修正できました。残念ながら、iOS 10/Xcode 8ではこれが機能しなくなりました。 [キャンセル]ボタンに白く見えないテキストが表示されないように、共有パネルに色を付けようとしました。
IOS 10で動作することがわかったのは、UIButton.appearance().tintColor = UIColor.red
だけです。これをアプリデリゲートでグローバルに設定できます(ただし、これはナビゲーションバーボタンなどにも色を付けるため、手動で別の色に色付けする必要があります)。これをビューでローカルに設定することもできますが、これは実際にはすべてのボタンタイプに適用されるグローバルテーマであるため、次のビューで選択したくない場合は、別の色に戻す必要があります。
したがって、UIActivityViewControllerを初期化した後、それを提示する前に、上記の行に色合いの色を追加することで、ActivityControllerボタンだけの色合いとして'hackish'の方法で機能させることができました。そして、ActivityControllerプレゼンテーション関数の完了ハンドラーで、好みの色(白)に色合いを戻します。
ex://共有する画像let image = UIImage(named: "Image")
// 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
}
})
私のために働いた-最初に現在の色合いをバックアップする
//COLCSocialManager.showShareActivityViewController(fromVC: aViewController)
class func showShareActivityViewController(fromVC vc: UIViewController){
let textToShare = "TAXI. New iOS app for tourists and cabbies. Check it out its free."
let linkToShare = "http://buff.ly/dddd"
//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
}
}
UIActivityController
の完了ハンドラーを使用したエレガントなソリューション。
let barTintColor = UINavigationBar.appearance().barTintColor
let bTintColour = UINavigationBar.appearance().tintColor
UINavigationBar.appearance().barTintColor = UIColor.white
UINavigationBar.appearance().tintColor = UIColor.darkGray
activityViewController.completionWithItemsHandler = {(activityType: UIActivityType?, completed: Bool, returnedItems: [Any]?, error: Error?) in
UINavigationBar.appearance().barTintColor = barTintColor
UINavigationBar.appearance().tintColor = bTintColour
}