无法更改 UIInputView 高度
Posted
技术标签:
【中文标题】无法更改 UIInputView 高度【英文标题】:Unable to change UIInputView height 【发布时间】:2014-09-30 11:46:01 【问题描述】:我有一个简单的 UIInputViewController 子类,只有两个被覆盖的方法。我在我的 UIViewController 子类上将此输入视图控制器用作inputAccessoryViewController
,它成为第一响应者。我尝试按照 Apple 文档的建议通过添加约束来指定 inputView 的高度。
问题是我的约束不起作用,并且在添加约束时出现自动布局异常
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 像素。它也打破了我的约束,高度保持默认。
- (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 文档没有提供任何帮助...
【问题讨论】:
V:[self(0)] 很奇怪——这个约束是谁加的?显然,它需要修复或至少删除。 可能是一个骇人听闻的解决方案,但在 updateConstraints 中找到 0/216 约束(实际上所有约束都只是高度,除了你的)并将其优先级设置为较低的值,以便在冲突时静默跳过. @user3125367 “谁添加了这个约束?” - 我正在寻找答案的确切问题:) 我会尝试你的建议并稍后发布,谢谢! 尝试子类化你的视图,覆盖addConstraint:
,看看是谁调用它。在此处发布堆栈跟踪。
@LeoNatan addConstraint 仅在我的约束下被调用。以前没有调用我的视图...我假设它被添加到 inputView 的某些超级视图中。我被困在同一点
【参考方案1】:
从 ios 9.0 开始,这可以通过 inputView.allowsSelfSizing = YES;
解决
【讨论】:
【参考方案2】:我不知道这是否是问题,但问题可能来自您在 _heightConstraint 上设置的 0.0 乘数。尝试将其更改为 1.0。
看起来像这样:
NSLayoutConstraint *_heightConstraint =
[NSLayoutConstraint constraintWithItem:self.view
attribute:NSLayoutAttributeHeight
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1.0
constant: _expandedHeight];
希望这会有所帮助!
【讨论】:
【参考方案3】:当您将视图作为 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)
您可以在事后修改此约束。
【讨论】:
注意,仅当您没有 setTranslatesAutoresizingMaskIntoConstrants 时才有效 这应该是正确的答案,对我有用(只要约束没有被转换为自动调整掩码) 这是关于 UIInputViewController 的 inputAccessory 视图,而不是 someTextView 之一。我不知道你为什么在谈论那个......它是相互独立的【参考方案4】:我是在 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)
【讨论】:
以上是关于无法更改 UIInputView 高度的主要内容,如果未能解决你的问题,请参考以下文章