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 方法中进行修改将不会起作用,所以具体实现如下:
解决后的样式如图:
经过上述方法,完美解决问题,如果哪位有更好的方法,欢迎指正!!!
所以只有在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); } } } }
解决后的样式如图:
经过上述方法,完美解决问题,如果哪位有更好的方法,欢迎指正!!!
相关文章推荐
- VO的Query关联其他表字段用于判断
- The Clojure (or Lisp) Equivalent of a Compound Boolean Test
- ueditor问题解决
- Redmine Tricks (1) How to make Target Version field required?
- 【C#】数据类型(sbyte,byte,short,ushort,int,uint,long,ulong和char。、、、)
- SQLServer 2005 和自增长主键identity说再见——NEWSEQUENTIALID()
- N-Queens II
- 【LeetCode】Permutation Sequence
- N-Queens
- String,StringBuffer,StringBuilder的效率问题
- ueditor插入代码,重新编辑,setContent报错
- Extjs4中up()和down()的用法以及组件查找_ComponentQuery类
- RoboGuice :Could not load finalizer in its own class loader 警告
- iOS7和iOS6 UI适配的问题
- UITableViewCell有关处理touch事件的问题
- UIView概念及创建UIView
- KendoUI MVVM用法
- 善良公社之EasyUI框架下在datagrid中显示数据
- NSString / NSData 和图片之间的转换
- Chrome不支持showModalDialog模态对话框和无法返回returnValue的问题