我无法相信我已经坚持了一个多星期。
我已经看过(并尝试过)其他所有Stack问题/答案,我可以找到,但没有工作。
基本上我有一个带有工具栏的详细视图,位于UITextView
下面,占据了剩下的空间,在它的边缘到了超视图的边缘留下了一个20点边框。
所有我需要的是当显示键盘时,textview将改变它的框架或内容嵌入的东西,这样键盘不会覆盖任何东西,文本滚动到它的文本末尾,任何新的打字键盘没有隐藏/换行 - 简单吧?呃......没有。
如果用户更改Orientation
(全部4个支持),则需要进行调整以适应。
然后在键盘解雇后,它需要返回到它的全尺寸(取决于可能的新方向)。
这是我用Autolayout
和iOS 7
完成的第一个项目(我遇到了iOS7
中的错误,它将您的新文本行放在'下方'文本视图的底部,但多亏了现在没问题的堆栈修复。)
然而,我从这个网站尝试过的解决方案都没有。
我正在设置UITextView
的约束,方法是将它放在portrait
的IB中,然后选择'重置为建议约束' - 如果是键盘,这似乎可以正确地为所有4个方向布局没有显示。
答案 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对上述答案所要求的唯一变化。非常感谢!这让我疯了一个星期!!!!