web-dev-qa-db-ja.com

UIActionSheetのアイテムのテキストの色を変更する-iOS 8

私は次のコードを使用して、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のビュー階層が変更されたと思います。

35
Salman Zaidi

古いバージョンの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")
36
nonamelive

ボタンのタイトルの色を変更するには、UIAlertControllerを使用し、メインのtintColorviewを設定する必要があります。

ボタンのタイトルの色を黒に設定する例:

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];
31
DiscDev

OK、私は同じ問題に遭遇しましたが、解決策を見つけたと思います:

適切な方法は次のようになり、iOS7で動作すると思います。

[[UIButton appearanceWhenContainedIn:[UIActionSheet class], nil] setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];

ただし、ActionSheetsの「ボタン」がUICollectionViewに基づいているため、iOS8では機能しません。だから、いくつか掘り下げた後、代わりにこれを動作させました:

[[UICollectionView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor blueColor]];
10
Janne

私はそれを使用しています。

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

1行(AppDelegate)を追加し、すべてのUIAlertControllerで機能します。

9
Lucas Torquato

私は同じ仕事をしていて、今日このハックを汚いものにしましたが、うまくいきます

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)
            }
        }
    }

}
6
Igor

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は、現在設定されている色合いを提供します。

3
Benjohn

tintColorwindowを変更するとうまくいきました。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions method

これを書いてください:

[self.window setTintColor:[UIColor redColor]];

これにより、すべてのUIActionSheetオブジェクトのフォントの色が変更されました。

3
Abdullah Umer

Swift 4

    let alert =  UIAlertController(title: "title", message: "message", preferredStyle: .alert)
    alert.view.tintColor = UIColor.black
    self.present(alert, animated: true, completion: nil)
0
Lukas Mohs

Swift=

    let alertAction = UIAlertAction(title: "XXX", style: .default) { (action) in

     }

    alertAction.setValue(UIColor.red, forKey: "titleTextColor")
0
Kuntal Gajjar