iOS: 如何防止 UITextField 离开屏幕

iOS: How can I prevent a UITextField from going off screen

我目前正在开发一个应用程序,它在 Vertical StackView 中有两个 UILabel,在 Vertical StackView 中有两个 UITextField,在一个 Horizo​​ntal StackView 中有两个 Vertical StackView:

我设置了限制条件。当应用程序在更大的设备(例如 iPhone 11)上运行时,它看起来很完美,如您所见:

但是如果我切换到像 iPhone 8 这样的较小设备,您可以看到线条紧贴 phone 的边缘:

我为 TextField 添加下划线的方法是使用我创建的名为 StyledTextField 的 class。它看起来像这样:

class StyledTextField: UITextField {

var bottomLine = CALayer()

override init(frame: CGRect) {
    super.init(frame: frame)
}

required init?(coder: NSCoder) {
    super.init(coder: coder)
    styleTextField()
}

private func styleTextField() {
    font = UIFont(name: "Quicksand", size: UIFont.labelFontSize)
    
    // Create the bottom line
    bottomLine.frame = CGRect(x: 0, y: frame.height - 2, width: frame.width, height: 2)
    
    bottomLine.backgroundColor = Environment.Colours.primary.cgColor
    
    // Remove border on text field
    borderStyle = .none
    
    // Add the line to the text field
    layer.addSublayer(bottomLine)
}

func makeUnderlineLight() {
    bottomLine.backgroundColor = Environment.Colours.primaryAssisted.cgColor
}
}

在 Storyboard 中,我将 UITextField class 指定为“StyledTextField”的那个。

此外,在处理 UITextFields 的控制器上的 viewDidLoad 函数中,我调用 setUpUI() 函数执行以下操作:

func setUpUI() {
    title = "Add Task"
    
    taskNameTextField.attributedPlaceholder = NSAttributedString(string: "Name", attributes: [NSAttributedString.Key.foregroundColor: Environment.Colours.lightGray])
    moreInfoTextField.attributedPlaceholder = NSAttributedString(string: "(Optional)", attributes: [NSAttributedString.Key.foregroundColor: Environment.Colours.lightGray])
    
    setUpDatePicker()
    moreInfoTextField.makeUnderlineLight()
    
    if isEditing() {
        showTaskToEdit()
    }
    view.backgroundColor = Environment.Colours.secondary
}

如您所见,我在其中调用了 makeUnderlineLight() StyledTextField 函数。

谢谢!

select 您的“更多信息:”标签并将水平压缩阻力优先级设置为 1000

无法在此处找到:

简单two-step解决方案:

  • 重写 styleTextField 以便它保留对下划线层的引用,并且 删除 下划线层(如果它已经存在),然后再创建一个新的下划线层一.

  • styleTextField() 的通话移至 layoutSubviews。 (别忘了拨打 super。)