0

我不敢相信我已经坚持了一个多星期。

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

基本上,我有一个带有工具栏的详细视图,在一个UITextView占据其余空间的下方,在它的边缘周围留下了 20 点边框到超级视图的边缘。

我所需要的只是当键盘显示时,文本视图要么改变它的框架,要么改变它的内容插入内容,这样键盘就不会覆盖任何东西,并且文本滚动到它的文本末尾,以及任何新的打字/换行是不是被键盘隐藏了——简单吧?呃没有。

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

然后随着键盘的关闭,它需要返回到它的全尺寸(取决于可能的新方向)。

这是我完成的第一个项目,Autolayout并且iOS 7(我遇到了iOS7将新文本行放在文本视图底部“下方”的错误,但感谢堆栈修复,现在可以了。)

但是,我从该站点尝试过的所有解决方案都不起作用。

UITextView通过将其定位在 IB 中portrait并选择“重置为建议的约束”来设置约束 - 如果未显示键盘,这似乎可以为所有 4 个方向正确布局。

4

3 回答 3

1

可以通过在键盘出现和消失时将约束调整到视图底部来完成。在下面的示例中,我有一个带有工具栏和文本视图的视图控制器。文本视图对主视图的底部和侧面有约束(值为 20),对视图顶部的工具栏有一个约束。我有一个 IBOutlet 到视图底部的约束。请注意,在 keyboardWillShow: 方法中,我必须检查视图的方向,以使约束的常量值正确——在横向模式下,键盘的宽度和高度是相反的(即,你得到的 size. 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];
}
于 2013-11-02T05:56:59.433 回答
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 也有它的底边固定。

而这个底部约束是与上述帖子中提到的 IBOutlet 相关联的约束。

还有更多想法出了什么问题?

于 2013-11-02T16:50:08.043 回答
0
CGSize kbSize       = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

if ( kbSize.height < kbSize.width )

这是 rdelmar 对上述答案所需的唯一更改。非常感谢!这让我发疯了一个星期!!!!

于 2013-11-03T00:14:01.553 回答