私は次のコードを使用して、UIActionSheet
に追加するアイテムのテキストの色を変更していました。
_- (void)willPresentActionSheet:(UIActionSheet *)actionSheet {
for (UIView *subview in actionSheet.subviews) {
if ([subview isKindOfClass:[UIButton class]]) {
UIButton *button = (UIButton *)subview;
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
}
}
}
_
_iOS7
_では正常に機能しますが、_iOS8
_では上記のコードはアイテムのテキストの色を変更しません。
ここで私の質問は、UIActionSheet
に追加するアイテムのテキストの色を_iOS8
_ ??を使用して変更する方法です。
追加情報:
ブレークポイントを追加して、上記のコードの次の行が実行されるかどうかを確認します。
_UIButton *button = (UIButton *)subview;
[button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
_
これらの行は実行されません。したがって、if([subview isKindOfClass:[UIButton class]])
は、_actionSheet.subviews
_のすべての項目で常にfalse
です。したがって、UIActionSheet
のビュー階層が変更されたと思います。
古いバージョンのiOSをサポートするために、UIActionSheet
の代わりにUIAlertController
を使用したい場合、簡単な方法があります。
UIActionSheet
はiOS 8で実際にUIAlertController
を使用し、プライベートプロパティ_alertController
。
SEL selector = NSSelectorFromString(@"_alertController");
if ([actionSheet respondsToSelector:selector])
{
UIAlertController *alertController = [actionSheet valueForKey:@"_alertController"];
if ([alertController isKindOfClass:[UIAlertController class]])
{
alertController.view.tintColor = [UIColor blueColor];
}
}
else
{
// use other methods for iOS 7 or older.
}
Swift以下のコードは動作するはずです
let alertAction = UIAlertAction(title: "XXX", style: .default) { (action) in
}
alertAction.setValue(UIColor.red, forKey: "titleTextColor")
ボタンのタイトルの色を変更するには、UIAlertController
を使用し、メインのtintColor
のview
を設定する必要があります。
ボタンのタイトルの色を黒に設定する例:
UIAlertController *actionSheetController = [UIAlertController alertControllerWithTitle:@"How would you like to proceed?" message:@"" preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *finish = [UIAlertAction actionWithTitle:@"Finish" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action)
{
[self performSelector:@selector(finish:) withObject:nil];
}];
UIAlertAction *playAgain = [UIAlertAction actionWithTitle:@"Play Again" style:UIAlertActionStyleDefault handler:^(UIAlertAction * action)
{
[self performSelector:@selector(playAgain:) withObject:nil];
}];
UIAlertAction *cancel = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action)
{
[actionSheetController dismissViewControllerAnimated:YES completion:nil];
}];
[actionSheetController addAction:finish];
[actionSheetController addAction:playAgain];
[actionSheetController addAction:cancel];
//******** THIS IS THE IMPORTANT PART!!! ***********
actionSheetController.view.tintColor = [UIColor blackColor];
[self presentViewController:actionSheetController animated:YES completion:nil];
OK、私は同じ問題に遭遇しましたが、解決策を見つけたと思います:
適切な方法は次のようになり、iOS7で動作すると思います。
[[UIButton appearanceWhenContainedIn:[UIActionSheet class], nil] setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
ただし、ActionSheetsの「ボタン」がUICollectionViewに基づいているため、iOS8では機能しません。だから、いくつか掘り下げた後、代わりにこれを動作させました:
[[UICollectionView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blueColor]];
私はそれを使用しています。
[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blueColor]];
1行(AppDelegate)を追加し、すべてのUIAlertControllerで機能します。
私は同じ仕事をしていて、今日このハックを汚いものにしましたが、うまくいきます
class CustomAlertViewController: UIAlertController {
internal var cancelText: String?
private var font: UIFont? = UIFont(name: "MuseoSansCyrl-500", size: 12)
override func viewDidLoad() {
super.viewDidLoad()
self.view.tintColor = UIColor.blackColor()
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
self.findLabel(self.view) //if you need ios 9 only, this can be made in viewWillAppear
}
func findLabel(scanView: UIView!) {
if (scanView.subviews.count > 0) {
for subview in scanView.subviews {
if let label: UILabel = subview as? UILabel {
if (self.cancelText != nil && label.text == self.cancelText!) {
dispatch_async(dispatch_get_main_queue(),{
label.textColor = UIColor.redColor() //for ios 8.x
label.tintColor = UIColor.redColor() //for ios 9.x
})
}
if (self.font != nil) {
label.font = self.font
}
}
self.findLabel(subview)
}
}
}
}
IOS 7の下位互換性のために、適切なデフォルトの色合いの色(Appleは将来のバージョンで変更される可能性があります)を収集するために、これを使用します。 デフォルトの色合い および Lucasの答え 上記。
const Class alertControllerClass = NSClassFromString(@"UIAlertController");
if(alertControllerClass)
{
UIColor *defaultTintColour = UIView.new.tintColor;
[[UIView appearanceWhenContainedIn: alertControllerClass, nil] setTintColor: defaultTintColour];
}
ただし、注意してください-これを使用することを確認する必要がありますbeforeそれ以外の場合はUIView.new.tintColor
は、現在設定されている色合いを提供します。
tintColor
のwindow
を変更するとうまくいきました。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions method
これを書いてください:
[self.window setTintColor:[UIColor redColor]];
これにより、すべてのUIActionSheet
オブジェクトのフォントの色が変更されました。
Swift 4
let alert = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
alert.view.tintColor = UIColor.black
self.present(alert, animated: true, completion: nil)
Swift=
let alertAction = UIAlertAction(title: "XXX", style: .default) { (action) in
}
alertAction.setValue(UIColor.red, forKey: "titleTextColor")