您的位置:首页 > 产品设计 > UI/UE

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

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



所以只有在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);
}
}
}
}

解决后的样式如图:





经过上述方法,完美解决问题,如果哪位有更好的方法,欢迎指正!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: