我有一个UITextField
将其设置inputView
为自定义视图的位置。它的标准高度为 216。我想将其设置为 300 或屏幕的一半。
使用约束不是一个选项,因为它与默认的 216 冲突并且它丢弃了我的约束。
设置框架也不起作用。
有没有办法将它设置为更高的值?
我有一个UITextField
将其设置inputView
为自定义视图的位置。它的标准高度为 216。我想将其设置为 300 或屏幕的一半。
使用约束不是一个选项,因为它与默认的 216 冲突并且它丢弃了我的约束。
设置框架也不起作用。
有没有办法将它设置为更高的值?
您需要子类化UIInputView
和覆盖allowsSelfSizing
返回值true,像这样
class MyInputView: UIInputView {
// ... other code
override var inputViewStyle: UIInputViewStyle { get { return .default } }
override var allowsSelfSizing: Bool { get { return true } set{} }
// ... other code
}
我通过将 设置autoResizingMask
为None
,并将 设置frame
为所需的帧(UIScreen.mainScreen
用于获取屏幕的宽度)来使其工作。layoutSubviews
在被调用之前我做了这两件事。
像这样设置 customInputView 的框架对我有用。
datePicker.frame = CGRect(x: view.frame.minX, y: view.frame.maxY - 250, width: view.frame.width, height: 250)
在这里,我使用 datePicker 作为我的 textField 的 inputView。
由于您提到要在Reddit 线程中使用 AutoLayout ,因此有几个选项。只是为了澄清一下,您有一个UITextField
并且您正在以编程方式将其 inputView 设置为自定义视图?您是否尝试根据屏幕/窗口高度以编程方式更改视图的高度?
如果您想使用 AutoLayout,那么约束几乎是您唯一的选择。正如您所发现的,仅尝试更新视图的Frame不会做任何事情,因为它将有利于预设约束。您需要做的是更改高度约束的constant
值。UITextField
首先,您需要在 Interface Builder 中向 UITextField 添加高度约束。您可以通过单击 IB 窗口右下角的约束按钮来做到这一点:
然后只需选中Height框,输入您想要的任何值,然后单击Add Constraints。
现在您需要在 ViewController 中获取对该约束的引用。首先,在 Assistant Editor 中打开相关 VC 的标题。然后,在屏幕左侧的 Scene Navigator 中找到有问题的约束,右键单击它,然后将其拖到您的标题中,就像任何其他 IBOutlet 一样。
现在,在您的代码中,您将引用该视图的高度约束,您可以使用constrant.constant = 100;
或您想要使用的任何值对其进行更新。不要忘记[[self view] layoutSubviews]
之后打电话让操作系统知道它需要更新布局。
我知道这几乎是我发现以编程方式可靠地更新约束和布局的唯一方法。希望它也对你有用。
您可以使用自动布局来实现,而无需继承 UIInputView。只是一个普通的 UIView 就可以了。在您的子类中,您必须添加以下内容:
class CustomView: UIView {
override var intrinsicContentSize: CGSize {
CGSize(width: UIView.noIntrinsicMetric, height: 300)
}
}