我有一个简单的UIInputViewController子类,只有两个重写方法。我在我的UIViewController子类上使用此输入视图控制器作为inputAccessoryViewController
,它成为第一响应者。我尝试通过添加约束来指定inputView的高度,如Apple文档所建议的那样。
问题是我的约束不起作用,并且在添加约束时我得到autolayout异常
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
...
(
"<NSLayoutConstraint:0x178aa1d0 V:[UIInputView:0x178a4ae0(0)]>",
"<NSLayoutConstraint:0x178b9520 V:[UIInputView:0x178a4ae0(500)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x178b9520 V:[UIInputView:0x178a4ae0(500)]>
我认为这意味着系统已经在输入视图中添加了零高度约束(因为它创建的高度为零)。现在他们冲突和自动布局打破我的约束来解决问题。
当我尝试将其用作我的视图控制器的inputViewController
时(仅用于测试目的),我得到相同的异常,但不是零高度,它是216 px。它也打破了我的约束,高度保持默认。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.inputView.translatesAutoresizingMaskIntoConstraints = NO;
self.inputView.backgroundColor = [UIColor redColor];
}
- (void)updateViewConstraints {
CGFloat _expandedHeight = 500;
NSLayoutConstraint *_heightConstraint =
[NSLayoutConstraint constraintWithItem:self.view
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:0.0
constant: _expandedHeight];
[self.inputView addConstraint: _heightConstraint];
[super updateViewConstraints];
}
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.view setNeedsUpdateConstraints];
}
因此,我无法更改输入附件视图高度。有没有人成功呢?显然,Apple文档没有提供任何帮助......
答案 0 :(得分:9)
从iOS 9.0开始,这可以通过inputView.allowsSelfSizing = YES;
答案 1 :(得分:3)
我不知道这是否是问题,但问题可能来自您在_heightConstraint上设置的0.0乘数。尝试将其更改为1.0。
看起来像这样:
NSLayoutConstraint *_heightConstraint =
[NSLayoutConstraint constraintWithItem:self.view
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant: _expandedHeight];
希望这有帮助!
答案 2 :(得分:1)
当您查看UITextView的输入附件视图时,只要文本视图成为第一响应者,就会自动添加一个高度约束设置为作为帧高度发送的任何内容。例如:
let inputView = UIInputView(frame: CGRectMake(0, 0, view.bounds.width, 200),
inputViewStyle: .Default)
someTextView.inputAccessoryView = inputView
someTextView.becomeFirstResponder()
assert((inputView.constraints().last as NSLayoutConstraint).constant == 200)
您可以在事后修改此约束。
答案 3 :(得分:0)
我是在Swift中做到的。 希望这可以帮助你。
override func viewDidAppear(animated: Bool) {
let heightConstraint = NSLayoutConstraint(
item:self.view,
attribute:NSLayoutAttribute.Height,
relatedBy:NSLayoutRelation.Equal,
toItem:nil,
attribute:NSLayoutAttribute.NotAnAttribute,
multiplier:0.0,
constant:100)
self.view.addConstraint(heightConstraint)
}