2014-03-29 33 views
0

我有一个iPhone 6应用程序(六件事),我在iOS 6中编写,其中有一个用户将文本输入到UITextView中的屏幕。显示键盘时,UITextView的大小会自动缩短,以便在用户键入时,光标不会隐藏在键盘后面(请参见图片)。如何根据用户操作在iOS 7中更改UIView(UITextView)的大小

enter image description here

我用下面的处理要做到这一点:

当被显示的键盘:

- (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(在界面构建器中使用deltas)正确调整元素(y位置)。

任何有帮助的建议,将不胜感激。

----------------------编辑方案------------------- ----------

因为解决这个问题有点棘手,我认为这将是有益的发布它。

  1. 我添加iOS6的一个第二文件的.xib(I只释放为IOS 6+)与自动布局关断,并根据需要调整的位置。然后,我做到以下几点:

    - (ID)initWithNibName:(![DeviceInfo isIOSAfter70):(的NSString *)nibNameOrNil束(一个NSBundle *)nibBundleOrNil { 如果 { 自我= [超级initWithNibName:@” CreateRecordViewControllerIOS6“bundle:nibBundleOrNil]; } else { self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; }}

**这是不是最完美的解决方案,但它的作品,我只是想支持iOS 6的用户,而不是用iOS 6的开发前进,所以它是。**

  • 我开启自动布局形式:
  • enter image description here

  • 予设定的底部约束在文本视图上并将其绑定到名为_bottomConstraint的IBOutlet。

  • 我修改为KeyboardDidShow /隐藏处理程序如下:

  • - (无效)keyboardDidHide:(ID)发送方 { ... 如果([DeviceInfo isIOSAfter70]) { if(_bottomConstraint!= nil) _bottomConstraint.constant = _bottomConstraintConstant; // IOS7 + if(_bottomConstraint!= nil) [self.view layoutIfNeeded]; } } ... }

    - (无效)keyboardDidShow:(ID)发送方 { ... 如果([DeviceInfo isIOSAfter70]) {// IOS7 + 如果(_bottomConstraint =零) { _bottomConstraintConstant = _bottomConstraint.constant; _bottomConstraint.constant + = kbSize.height; [self.view layoutIfNeeded]; }} ... }

    +0

    在iOS 7中更改'view'的'frame'没有任何改变。您的代码将像以前一样工作。我认为你做了其他错误。 – ismailgulek

    +0

    嗯....它似乎并没有在模拟器正常工作...我会尝试一个真正的手机上,也许模拟器是骗我... – FuzzyBunnySlippers

    +0

    我检查了一个真实的设备,iPhone 4与iOS 7.它在那里被打破,但在iOS 6中用于模拟器(并且以前在iPhone上的iOS 6中)按预期工作。 – FuzzyBunnySlippers

    回答

    1

    我曾与iOS7下设置帧类似的问题。我认为打击汽车限制并不明智。只需启用自动约束(如果可以的话)和动画约束。 您可以使用接口构建器从约束中创建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 
    }]; 
    

    我正在移动一个约束,只是为了告诉你它是如何完成的。另外,使用约束时,不要直接设置帧。

    希望它有帮助。

    +0

    我发现,如果我使用自动布局,iOS 7解决方案可以正常工作,但那么它不会像iOS 6中预期的那样工作。仍然在考虑这个... – FuzzyBunnySlippers

    +0

    好的。这工作使iOS 7显示视图控制器更改UIText视图更正的大小(我不需要清理动画)。对于IOS6,我只是添加了一个特殊版本的.xib文件,并将自动布局关闭。在initWithNibName调用中,我检查它是否在IOS7之前,并加载了第二个.xib,这看起来好像是一个很好的妥协。 – FuzzyBunnySlippers

    相关问题