【问题标题】:How do I change the size of a UIView (UITextView) in iOS 7 based on user actions如何根据用户操作在 iOS 7 中更改 UIView (UITextView) 的大小
【发布时间】: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 位置)。

任何有用的建议将不胜感激。

---------------------- 使用解决方案编辑 ---------------- -------------

因为解决这个问题有点棘手,所以我认为发布它会有所帮助。

  1. 我为 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 开发,所以它就是这样。 **

  1. 我为表单打开了自动布局:

  1. 我在文本视图上设置了一个底部约束并将其绑定到一个名为 _bottomConstraint 的 IBOutlet。

  2. 我修改了 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 中更改 viewframe 没有任何改变。您的代码将照常工作。我认为你做错了什么。
  • 嗯....它在模拟器中似乎无法正常工作...我将在真机上尝试它,也许模拟器在欺骗我...
  • 我在真实设备上检查了它,iPhone 4 和 iOS 7。它在那里坏了,但在 iOS 6 模拟器中可以正常工作(之前在 iPhone 上的 iOS 6 中也是如此)。

标签: ios iphone objective-c ios7


【解决方案1】:

iOS7 下的设置框架也有类似的问题。我认为对抗自动约束不是很明智。只需启用自动约束(如果可以)和动画约束。 您可以使用 Interface builder 从约束创建 IBOutlet,或者如果您以编程方式创建约束,请保留对它的引用。比使用类似这样的代码:

[self.view layoutIfNeeded];
self.constrainVertical.constant = 10;
[UIView animateWithDuration:0.3 animations:^{
    [self.view layoutIfNeeded];
} completion:^(BOOL finished) {
    //put some finalizing code here if needed
}];

我只移动一个约束,只是为了向您展示它是如何完成的。另外,在使用约束时,不要直接设置框架。

希望对你有帮助。

【讨论】:

  • 我发现如果我使用自动布局,iOS 7 解决方案可以正常工作,但在 iOS 6 中它无法按预期工作。仍在考虑这个...
  • 好的。这适用于使 iOS 7 显示的视图控制器更改 UIText 视图校正的大小(我不需要动画来清理)。对于 IOS6,我刚刚添加了一个特殊版本的 .xib 文件,并关闭了自动布局。在 initWithNibName 调用中,我检查了它是否在 IOS7 之前并加载了第二个 .xib,目前这似乎是一个不错的折衷方案。
猜你喜欢
  • 2013-10-03
  • 2012-07-23
  • 2017-06-16
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 2014-12-29
  • 2015-08-17
  • 1970-01-01
相关资源
最近更新 更多