更改 UIAlertview 和 UIActionsheet 按钮的色调颜色

Posted

技术标签:

【中文标题】更改 UIAlertview 和 UIActionsheet 按钮的色调颜色【英文标题】:Change tint color of UIAlertview and UIActionsheet buttons 【发布时间】:2013-11-15 06:38:42 【问题描述】:

我正在尝试使我的应用程序适应 ios 7。我遇到的问题是我无法更改某些控件的色调颜色。

我确实添加了

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
if (IOS7_OR_LATER)
    self.window.tintColor = [self greenTintColor];

给我的应用代表

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

这在很大程度上有所帮助,但消息框和操作表按钮的颜色仍然是默认的蓝色。

我怎样才能为所有这些按钮重新着色?

一些截图:

【问题讨论】:

【参考方案1】:

我能够在应用委托中将取消按钮的文本颜色更改为白色。

[[UIView appearance] setTintColor:[UIColor whiteColor]];

【讨论】:

拯救了我的一天!必须回答! 嗯,它做的比它应该做的要多。我宁愿使用[[UIView appearanceWhenContainedIn:[UIAlertView class], nil] setTintColor:[UIColor whiteColor]];[[UIView appearanceWhenContainedIn:[UIAlertController class], nil] setTintColor:[UIColor whiteColor]]; 我也更喜欢@KévinRenella 的回答。阿里的回答很危险。 @KévinRenella 您改进答案的快速版本是什么? @DanielSpringer 即使我相信你也可以自己找到这个 ;) UIView.appearance(whenContainedInInstancesOf: [UIAlertView.self]).tintColor = UIColor.whiteUIView.appearance(whenContainedInInstancesOf: [UIAlertController.self]).tintColor = UIColor.white【参考方案2】:

UIAlertView 已被弃用,您可以。使用 UIAlertController

您可以使用 tintColor 属性。

UIAlertView 类旨在按原样使用,而不是 支持子类化。此类的视图层次结构是私有的,并且 不得修改。

-来自 Apple Doc

你可以使用 tintColor 属性或者你可以使用一些自定义库,你可以在 cocoacontrols.com 找到它。

【讨论】:

在 iOS 8 中有 alert.view.tintColor = UIColor.redColor() 答案已从***.com/a/19198435/1262634复制,至少改一下文字!【参考方案3】:

对于 Actionsheet 你可以使用

利用 UIActionSheet 的 willPresentActionSheet 委托方法更改操作表按钮颜色。

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet

    for (UIView *subview in actionSheet.subviews) 
        if ([subview isKindOfClass:[UIButton class]]) 
            UIButton *button = (UIButton *)subview;
            button.titleLabel.textColor = [UIColor greenColor];
        
    

【讨论】:

但是,此更改只是暂时的。如果您点击并按住一个按钮并在其外部释放触摸,颜色将变回默认颜色。事实上,它已经在触地时更改为默认颜色。 请致电[button setTitleColor:forControlState: 以使其持续。【参考方案4】:

结合上面的最佳答案,并更新为弃用:

[[UIView appearanceWhenContainedInInstancesOfClasses:@[[UIAlertController class]]] setTintColor:[UIColor greenColor]];

或斯威夫特:

UIView.appearance(whenContainedInInstancesOf: [UIAlertController.self]).tintColor = .green

适用于 2018 年,Swift 4 / iOS 12。

【讨论】:

【参考方案5】:

您可以通过在显示警报后立即创建的警报窗口的子视图层次结构中搜索和修改UILabel 来调整颜色:

- (void)setButtonColor:(UIColor*)buttonColor 
    dispatch_after(dispatch_time(0,1), dispatch_get_main_queue(), ^
        NSMutableArray *buttonTitles = [NSMutableArray array];
        for (NSUInteger index = 0; index < self.numberOfButtons; index++) 
            [buttonTitles addObject:[self buttonTitleAtIndex:index]];
        
        for (UILabel *label in [[[UIApplication sharedApplication] keyWindow] recursiveSubviewsOfKind:UILabel.class]) 
            if ([buttonTitles containsObject:label.text]) 
                label.textColor = buttonColor;
                label.highlightedTextColor = buttonColor;
            
        
    );


[alert show];
[alert setButtonColor:UIColor.redColor];

recursiveSubviewsOfKind: 方法是 UIView 上的一个类别,它返回给定类或子类的完整子视图层次结构中的视图数组。

【讨论】:

谢谢。这适用于UIAlertView,但也有UIBarButtonItems,例如。对于UIBarButtonItem,效果是暂时的:点击或按住按钮后颜色恢复为默认值。【参考方案6】:

对于带有彩色按钮的 UIAlertView,您可以使用 cocoapod "SDCAlertView"

关于 CocoaPods:http://www.cocoapods.org

如何安装 CocoaPods:https://www.youtube.com/watch?v=9_FbAlq2g9o&index=20&list=LLSyp50_buFrhXC0bqL3nfiw

【讨论】:

谢谢。看起来很有希望。【参考方案7】:

在 iOS 6.0 中,在 App 委托中创建自定义视图

.h
UIView* _loadingView;
    UIView* _subView;
    UIActivityIndicatorView*loadingIndicator;
    UITabBarController *tabBar_Controller;
    NSTimer *timer;


@property (strong, nonatomic) UIView* _loadingView;
@property (strong, nonatomic) UIView* _subView;



.m- (void)fadeScreen

    [UIView beginAnimations:nil context:nil]; // begins animation block
    [UIView setAnimationDuration:3.0]; // sets animation duration
    [UIView setAnimationDelegate:self]; // sets delegate for this block
    [UIView setAnimationDidStopSelector:@selector(finishedFading)];
    self.txtview.alpha = 0.0;  // Fades the alpha channel of this view
    [UIView commitAnimations];  // commits the animation block.  This




- (void) finishedFading

    [self.txtview removeFromSuperview];





- (void)showConnectivity:(NSString *)strTitle

    [_loadingView setBackgroundColor:[UIColor clearColor]];
    [_loadingView setAlpha:0.5];
    [_loadingView.layer setCornerRadius:10];
    [self.window addSubview:_loadingView];
    [_loadingView setHidden:NO];

    [_subView.layer setCornerRadius:7];
    [_subView setBackgroundColor:[UIColor colorWithHue:0.0f saturation:0.0f brightness:0.0f alpha:0.6]];
    [_subView setOpaque:YES];
    [self.window addSubview:_subView];
    [_subView setHidden:NO];

    [_loadingView setHidden:NO];
    [_subView setHidden:NO];

    loadingIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    [loadingIndicator setFrame:CGRectMake(85,10,35,35)];
    [_subView addSubview:loadingIndicator];
    [loadingIndicator setBackgroundColor:[UIColor redColor]];
    [loadingIndicator startAnimating];

    UILabel *_lab=[[UILabel alloc]initWithFrame:CGRectMake(8,10,72,45)];
    [_lab setText:strTitle];
    [_lab setTextColor:[UIColor whiteColor]];
    [_lab setBackgroundColor:[UIColor clearColor]];
    [_lab setFont:[UIFont boldSystemFontOfSize:13.0]];
    [_lab setTextAlignment:NSTextAlignmentCenter];
    [_subView addSubview:_lab];




- (void)CoonectingViewHidden


    [_loadingView setHidden:YES];
    [_subView setHidden:YES];

    NSArray *_aryViews = [_subView subviews];
    for(int i = 0; i<[_aryViews count];i++)
    
        id obj = [_aryViews objectAtIndex:i];
        if(![obj isKindOfClass:[UIActivityIndicatorView class]])
            [obj removeFromSuperview];
    
    [loadingIndicator stopAnimating];
    [loadingIndicator hidesWhenStopped];





in using .m
#import"Appdelegate.h"

- (void)showLoadingIndicator:(NSString *)message

    AppDelegate *delegateObj2=(AppDelegate *)[UIApplication sharedApplication].delegate;
    [delegateObj2 showConnectivity:message];

-(void)stopLoading

    AppDelegate *delegateObj3=(AppDelegate *)[UIApplication sharedApplication].delegate;
    [delegateObj3 CoonectingViewHidden];





// [self showLoadingIndicator:@"Loading"];
n

[self stopLoading];

【讨论】:

以上是关于更改 UIAlertview 和 UIActionsheet 按钮的色调颜色的主要内容,如果未能解决你的问题,请参考以下文章

应用访问地图服务时系统弹出UIAlertView,可以更改UIAlertView的消息吗?

更改 UIAlertview 和 UIActionsheet 按钮的色调颜色

如何更改 UIAlertView 按钮的宽度?

UIAlertView 更改 UITabbar 项目选定的颜色

在 iOS7 中更改 UIAlertView 的字体大小

更改 UIAlertView 键盘的类型