如何设置自定义 inputView 的高度?
How can I set height of custom inputView?
我有一个 UITextField
,我将 inputView
设置为自定义视图。它的标准高度为 216。我想将其设置为 300 或屏幕的一半。
不能使用约束,因为它与默认的 216 冲突并且它会丢弃我的约束。
设置边框也不行
有什么方法可以将其设置为更高的值吗?
既然您提到要在 Reddit thread about this 中使用 AutoLayout,则有几个选项。澄清一下,您有一个 UITextField
并且您正在以编程方式将它的 inputView 设置为自定义视图?您是否尝试根据 screen/window 高度以编程方式更改视图的高度?
如果您想使用 AutoLayout,那么约束几乎是您唯一的选择。正如您所发现的,仅尝试更新视图的 Frame 不会执行任何操作,因为它会支持预设约束。您需要做的是更改 UITextField
高度限制的 constant
值。
首先,您需要在 Interface Builder 中为 UITextField 添加高度限制。您可以通过单击 IB window 的 lower-right 中的约束按钮来执行此操作:
然后只需选中 Height 框,输入您想要的任何值,然后单击 Add Constraints。
现在您需要在 ViewController 中获取对该约束的引用。首先,在助理编辑器中为有问题的 VC 打开 header。然后,在屏幕左侧的 Scene Navigator 中找到有问题的约束,right-click 并将其拖到 header 中,就像拖其他任何 IBOutlet 一样。
现在,在您的代码中,您将引用该视图的高度限制,您可以使用 constrant.constant = 100;
或您想要使用的任何值来更新它。不要忘记在之后调用 [[self view] layoutSubviews]
让 OS 知道它需要更新布局。
我知道这几乎是我发现的以编程方式可靠地更新约束和布局的唯一方法。希望它也对你有用。
我通过将 autoResizingMask
设置为 None
并将 frame
设置为所需的帧(使用 UIScreen.mainScreen
获得屏幕)。在 layoutSubviews
被调用之前,我做了这两件事。
您需要子类 UIInputView
并覆盖 allowsSelfSizing
以获得 return 值 true,就像这样
class MyInputView: UIInputView {
// ... other code
override var inputViewStyle: UIInputViewStyle { get { return .default } }
override var allowsSelfSizing: Bool { get { return true } set{} }
// ... other code
}
像这样设置 customInputView 的框架,对我有用。
datePicker.frame = CGRect(x: view.frame.minX, y: view.frame.maxY - 250, width: view.frame.width, height: 250)
这里我使用了 datePicker 作为我的 textField 的 inputView。
您可以使用自动布局来完成它,而无需子类化 UIInputView。只需一个普通的 UIView 就可以了。在您的子类中,您必须添加以下内容:
class CustomView: UIView {
override var intrinsicContentSize: CGSize {
CGSize(width: UIView.noIntrinsicMetric, height: 300)
}
}
我有一个 UITextField
,我将 inputView
设置为自定义视图。它的标准高度为 216。我想将其设置为 300 或屏幕的一半。
不能使用约束,因为它与默认的 216 冲突并且它会丢弃我的约束。
设置边框也不行
有什么方法可以将其设置为更高的值吗?
既然您提到要在 Reddit thread about this 中使用 AutoLayout,则有几个选项。澄清一下,您有一个 UITextField
并且您正在以编程方式将它的 inputView 设置为自定义视图?您是否尝试根据 screen/window 高度以编程方式更改视图的高度?
如果您想使用 AutoLayout,那么约束几乎是您唯一的选择。正如您所发现的,仅尝试更新视图的 Frame 不会执行任何操作,因为它会支持预设约束。您需要做的是更改 UITextField
高度限制的 constant
值。
首先,您需要在 Interface Builder 中为 UITextField 添加高度限制。您可以通过单击 IB window 的 lower-right 中的约束按钮来执行此操作:
然后只需选中 Height 框,输入您想要的任何值,然后单击 Add Constraints。
现在您需要在 ViewController 中获取对该约束的引用。首先,在助理编辑器中为有问题的 VC 打开 header。然后,在屏幕左侧的 Scene Navigator 中找到有问题的约束,right-click 并将其拖到 header 中,就像拖其他任何 IBOutlet 一样。
现在,在您的代码中,您将引用该视图的高度限制,您可以使用 constrant.constant = 100;
或您想要使用的任何值来更新它。不要忘记在之后调用 [[self view] layoutSubviews]
让 OS 知道它需要更新布局。
我知道这几乎是我发现的以编程方式可靠地更新约束和布局的唯一方法。希望它也对你有用。
我通过将 autoResizingMask
设置为 None
并将 frame
设置为所需的帧(使用 UIScreen.mainScreen
获得屏幕)。在 layoutSubviews
被调用之前,我做了这两件事。
您需要子类 UIInputView
并覆盖 allowsSelfSizing
以获得 return 值 true,就像这样
class MyInputView: UIInputView {
// ... other code
override var inputViewStyle: UIInputViewStyle { get { return .default } }
override var allowsSelfSizing: Bool { get { return true } set{} }
// ... other code
}
像这样设置 customInputView 的框架,对我有用。
datePicker.frame = CGRect(x: view.frame.minX, y: view.frame.maxY - 250, width: view.frame.width, height: 250)
这里我使用了 datePicker 作为我的 textField 的 inputView。
您可以使用自动布局来完成它,而无需子类化 UIInputView。只需一个普通的 UIView 就可以了。在您的子类中,您必须添加以下内容:
class CustomView: UIView {
override var intrinsicContentSize: CGSize {
CGSize(width: UIView.noIntrinsicMetric, height: 300)
}
}