无法更改 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 高度的主要内容,如果未能解决你的问题,请参考以下文章

如何为输入附件视图的高度设置动画?

无法更改 FBSDKLoginKit 中登录按钮的高度?

无法更改本机基本标签的高度

iOS 11 - 无法更改导航栏高度

swift 4中无法更改导航栏的高度

无法在颤动中更改按钮的高度