iOS 7 - SplitViewController详细信息视图 - Autolayout UITextView键盘方向更改

时间:2013-11-01 23:21:03

标签: ios keyboard orientation uitextview autolayout

我无法相信我已经坚持了一个多星期。

我已经看过(并尝试过)其他所有Stack问题/答案,我可以找到,但没有工作。

基本上我有一个带有工具栏的详细视图,位于UITextView下面,占据了剩下的空间,在它的边缘到了超视图的边缘留下了一个20点边框。

所有我需要的是当显示键盘时,textview将改变它的框架或内容嵌入的东西,这样键盘不会覆盖任何东西,文本滚动到它的文本末尾,任何新的打字键盘没有隐藏/换行 - 简单吧?呃......没有。

如果用户更改Orientation(全部4个支持),则需要进行调整以适应。

然后在键盘解雇后,它需要返回到它的全尺寸(取决于可能的新方向)。

这是我用AutolayoutiOS 7完成的第一个项目(我遇到了iOS7中的错误,它将您的新文本行放在'下方'文本视图的底部,但多亏了现在没问题的堆栈修复。)

然而,我从这个网站尝试过的解决方案都没有。

我正在设置UITextView的约束,方法是将它放在portrait的IB中,然后选择'重置为建议约束' - 如果是键盘,这似乎可以正确地为所有4个方向布局没有显示。

3 个答案:

答案 0 :(得分:1)

可以通过在键盘出现和消失时将约束调整到视图底部来完成。在下面的示例中,我有一个带有工具栏和文本视图的视图控制器。文本视图对主视图的底部和侧面具有约束(值为20),对视图顶部的工具栏具有约束。我有一个IBOutlet约束到视图的底部。请注意,在keyboardWillShow:方法中,我必须检查视图的方向以使约束的常量值正确 - 在横向模式下,键盘的宽度和高度是相反的(即,您获得的大小。 width实际上是高度,size.height给你宽度。

@interface ViewController ()
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomCon; // outlet to the constraint between the text view and the bottom of the view
@property (weak,nonatomic) IBOutlet UITextView *tv; // outlet for the text view
@end

@implementation ViewController


- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
}



- (void)keyboardWillShow:(NSNotification*)aNotification {
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    if (self.view.bounds.size.width < self.view.bounds.size.height) {
        self.bottomCon.constant = kbSize.height + 20;
    }else{
        self.bottomCon.constant = kbSize.width + 20;
    }
}


-(void)keyboardDidShow:(NSNotification *) aNotificaation {
    [self.tv scrollRangeToVisible:NSMakeRange(self.tv.text.length - 1, 1)];
}


- (void)keyboardWillHide:(NSNotification*)aNotification {
    self.bottomCon.constant = 20;
}

-(IBAction)finishedEditing:(id)sender { // action for "Done" button on tool bar
    [self.tv resignFirstResponder];
}

答案 1 :(得分:0)

上面建议的代码修复从非常有用的rdelmar完美的肖像。然而,更改为横向会导致此崩溃:

Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x941da50 V:|-(158)-[UITextView:0x9926000]   (Names: '|':UIView:0x9449a30 )>",
    "<NSLayoutConstraint:0x9449a00 V:[UITextView:0x9926000]-(1044)-|   (Names: '|':UIView:0x9449a30 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x97b2d70 h=--& v=--& V:[UIView:0x9449a30(768)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x9449a00 V:[UITextView:0x9926000]-(1044)-|   (Names: '|':UIView:0x9449a30 )>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

现在,我已从我的详细视图中清除了每个约束,并重新开始。 UILabel,UIToolBar和UITextView都有其前导,尾随和顶边PINNED。

UITextView也有它的BOTTOM EDGE PINNED。

这个底部约束是与上述帖子中提到的IBOutlet链接的约束。

还有什么想法会出错?

答案 2 :(得分:0)

CGSize kbSize       = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

if ( kbSize.height < kbSize.width )

这是rdelmar对上述答案所要求的唯一变化。非常感谢!这让我疯了一个星期!!!!