【发布时间】:2014-05-09 08:43:45
【问题描述】:
我有一个我在 iOS 6 中编写的 iPhone 应用程序(六件事),它有一个屏幕,用户可以在其中向 UITextView 输入文本。显示键盘时,UITextView 的大小会自动缩短,因此当用户键入时,光标不会隐藏在键盘后面(见图)。
我使用以下处理程序来执行此操作:
显示键盘时:
- (void)keyboardDidShow:(id)sender
{
NSDictionary* info = [sender userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
_txtSizeBase = self._txtInfo.frame;
float offset = kbSize.height < kbSize.width?kbSize.height:kbSize.width;
_txtSizeKeyboard = CGRectMake(_txtSizeBase.origin.x, _txtSizeBase.origin.y, _txtSizeBase.size.width, _txtSizeBase.size.height-offset+60);
self._txtInfo.frame = _txtSizeKeyboard;
...
}
当按下“完成”按钮并关闭键盘时:
- (void)keyboardDidHide:(id)sender
{
self._txtInfo.frame = _txtSizeBase;
...
}
这在 iOS 6 中运行良好。但在 iOS 7 中,我不知道有一种方法可以强制视图更改其大小之后 viewDidLoad 已经被调用。更改框架的大小不会导致它调整大小。
我已关闭此表单的自动布局,以便我可以为 iOS 6/7(在界面生成器中使用增量)正确调整屏幕元素(y 位置)。
任何有用的建议将不胜感激。
---------------------- 使用解决方案编辑 ---------------- -------------
因为解决这个问题有点棘手,所以我认为发布它会有所帮助。
-
我为 IOS6 添加了第二个 .xib 文件(我只为 IOS 6+ 发布)关闭了自动布局并根据需要调整了位置。然后我执行以下操作:
-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if(![DeviceInfo isIOSAfter70]) { self = [super initWithNibName:@"CreateRecordViewControllerIOS6" bundle:nibBundleOrNil]; } 别的 { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; } }
** 这不是最优雅的解决方案,但它有效,我只想支持 IOS 6 用户,而不是继续使用 IOS 6 开发,所以它就是这样。 **
- 我为表单打开了自动布局:
我在文本视图上设置了一个底部约束并将其绑定到一个名为 _bottomConstraint 的 IBOutlet。
我修改了 KeyboardDidShow/Hide 的处理程序如下:
-(void)keyboardDidHide:(id)sender { ... if([DeviceInfo isIOSAfter70]) { // IOS7+ if(_bottomConstraint != nil) { _bottomConstraint.constant = _bottomConstraintConstant; [self.view layoutIfNeeded]; } } ... }
-(void)keyboardDidShow:(id)sender { ... if([DeviceInfo isIOSAfter70]) { // IOS7+ if(_bottomConstraint != nil) { _bottomConstraintConstant = _bottomConstraint.constant; _bottomConstraint.constant += kbSize.height; [self.view layoutIfNeeded]; } } ... }
【问题讨论】:
-
在 iOS 7 中更改
view的frame没有任何改变。您的代码将照常工作。我认为你做错了什么。 -
嗯....它在模拟器中似乎无法正常工作...我将在真机上尝试它,也许模拟器在欺骗我...
-
我在真实设备上检查了它,iPhone 4 和 iOS 7。它在那里坏了,但在 iOS 6 模拟器中可以正常工作(之前在 iPhone 上的 iOS 6 中也是如此)。
标签: ios iphone objective-c ios7