iOS 修改原生弹出框

Objective-C

开发过程中,一般需要用到弹出框提醒用户,使用系统自带的AlertController最方便快捷,但有时候往往需要自定义其中的某些样式。如图:


1.png

我们可以通过递归的方式找到alertview然后进行自定义

    //递归找到title
    UIView *messageParentView = [self getParentViewOfTitleAndMessageFromView:alert.view];
    if (messageParentView && messageParentView.subviews.count > 1) {
        DLog(@"%@",messageParentView.subviews);
    }
- (UIView *)getParentViewOfTitleAndMessageFromView:(UIView *)view {
    for (UIView *subView in view.subviews) {
        if ([subView isKindOfClass:[UILabel class]]) {
            return view;
        }else{
            UIView *resultV = [self getParentViewOfTitleAndMessageFromView:subView];
            if (resultV) return resultV;
        }
    }
    return nil;
}

通过打印的subviews

[
<UILabel: 0x7f90987d2e90; frame = (0 0; 0 0); text = '1、订单交易完成后雨露才会进入账户(线上交易为快递...'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x608000482a80>>,
<UILabel: 0x7f90987b1d00; frame = (0 0; 0 0); text = ''; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x608000095090>>,
<UIView: 0x7f90987cd8d0; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x60800043c3e0>>,
<UIView: 0x7f90987e4500; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x60800043efe0>>
]

找到前2个Label分别是title和message。

文章终于有人看了看到评论有疑问补个swift版的

swift

道理都是通的

 if let view = self.getParentViewOfTitleAndMessageFromView(view: alertC.view) {
            print(view.subviews)
        }
func getParentViewOfTitleAndMessageFromView(view:UIView) -> UIView? {
        for item in view.subviews {
            if item.isKind(of: UILabel.self) {//如果subview包含label直接返回
                return view
            }else{//继续遍历 找到包含label的view
                if let resultView = self.getParentViewOfTitleAndMessageFromView(view: item) {
                    return resultView
                }
            }
        }
        return nil
    }

通过打印的subviews

[<UILabel: 0x15fe11e00; frame = (0 0; 0 0); text = '标题'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x1c4091800>>,
 <UILabel: 0x15fe12480; frame = (0 0; 0 0); text = '内容'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x1c4092f70>>,
 <UIView: 0x15fe10690; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x1c422ac20>>, 
 <UIView: 0x15fe12de0; frame = (0 0; 0 0); clipsToBounds = YES; layer = <CALayer: 0x1c422a060>>]

找到前2个Label分别是title和message。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS 8的新特性之一就是让接口更有适应性、更灵活,因此许多视图控制器的实现方式发生了巨大的变化。全新的UIPre...
    乌拉拉zzZ阅读 4,432评论 0 2
  • 一.UIView属性 1.alpha 设置视图的透明度.默认为1. //完全透明 view.alpha=0; //...
    奋斗ing0310阅读 6,235评论 0 2
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,196评论 4 61
  • 不知不觉,亲子日志已经是第二十篇,看来日志已经变成一种习惯。 今天下班已经改成五点半,刚好可以接辅导班送回的孩子,...
    明懿妈妈阅读 890评论 0 3
  • 侄女又被送到我这儿,嘟囔着说作业多。我笑了~周六周日的作业不完成,这下周一下午放假到周五上学,又三天半的作业,堆在...
    尘世莲阅读 3,051评论 0 1