天天看点

UIAlertView 含有超过两个按钮和输入框同时存在的适配问题

在iOS 7 系统以下,如果UIAlertView 上有超过两个按钮并且有输入框同时存在的时候,就会出现一下问题,输入框被按钮挡住了(IOS 7 上不会有问题)图如附件:

UIAlertView 含有超过两个按钮和输入框同时存在的适配问题

所以只有在AlertView 绘制的时候修改 按钮和输入框的Frame , 可以选在重写UIAlertView 或 在使用UIAlertView的类别扩展(缺点是将会影响同一个类中所有UIAlertView 的绘制), 需要重写的方法是- (void)layoutSubviews; 经过验证

- (void)drawRect:(CGRect)rect; 方法执行在layoutSubviews 方法之后,如果在- (void)drawRect:(CGRect)rect 方法中进行修改将不会起作用,所以具体实现如下:

//layout 执行的顺序在 drawRect 之前
//在iOS 7 后,drawRect 和 layoutSubviews 不会自动执行,除非涉及到setFrame addView 等
//在iOS 5 中,此方法会被重复调用4次
- (void)layoutSubviews{
    return;
    if ([UIDevice currentDevice].systemVersion.floatValue >= 7.0f) {
        return;
    }
    CGRect frame = self.frame;
    frame.size.height = frame.size.height + 50;
    frame.origin.y = frame.origin.y - 25;
    self.frame = frame;
    
    if ([UIDevice currentDevice].systemVersion.floatValue >= 6.0f) {
        for (UIView *view in self.subviews) {
            NSString *class = NSStringFromClass([view class]);
            if ([class isEqualToString:@"UIAlertSheetTextField"] || [class isEqualToString:@"UIThreePartImageView"] || [class isEqualToString:@"UIAlertButton"] ) {
                CGRect vFrame = view.frame;
                vFrame.origin.y = vFrame.origin.y + 50;
                NSLog(@"class: %@ , frame : %@", class, NSStringFromCGRect(vFrame));
                view.frame = vFrame;
            }
        }
    }else{
       //5.0 - 6.0 系统, 在5.n 系统中,layoutSubviews 方法会被执行多次,所以选在静态修改frame
        int alertBtnIndex = 0;
        for (UIView *view in self.subviews) {
            NSString *class = NSStringFromClass([view class]);
            if ([class isEqualToString:@"UIAlertButton"] ) {
                if (alertBtnIndex == 0) {
                    view.frame = CGRectMake(11, 209, 262, 43);
                }else if (alertBtnIndex == 1){
                    view.frame = CGRectMake(11, 95, 262, 43);
                }else if (alertBtnIndex == 2){
                    view.frame = CGRectMake(11, 145, 262, 43);
                }
                alertBtnIndex ++;
            }else if ([class isEqualToString:@"UIThreePartImageView"]) {
                view.frame = CGRectMake(11, 50, 262, 31);
            }else if ([class isEqualToString:@"UIAlertSheetTextField"]){
                view.frame = CGRectMake(16, 50, 252, 31);
            }
        }
    }
}
           

解决后的样式如图:

UIAlertView 含有超过两个按钮和输入框同时存在的适配问题
UIAlertView 含有超过两个按钮和输入框同时存在的适配问题

经过上述方法,完美解决问题,如果哪位有更好的方法,欢迎指正!!!