【问题标题】:UITextfield leftView as overlayUITextfield leftView 作为覆盖
【发布时间】:2015-06-25 23:55:48
【问题描述】:

我正在尝试添加一个“错误消息”气泡,当用户输入不正确的值时,该气泡会出现在文本字段的顶部。我一直在使用 .leftView 属性,它工作得很好,但是它占用了 textField 中的“空间”,将内容推到了右边。将 leftView 显示为“覆盖”而不是字段本身的最佳方式是什么? (即删除它的边界)

class ValidatedTextField: UITextField {     
override init(frame: CGRect) {
    super.init(frame: frame)

    // Defaults
    maxLength = 40
    layer.sublayerTransform = CATransform3DMakeTranslation(leftPadding, 0, 0)
    backgroundColor = UIColor.whiteColor()

    // Listen in on own text input
    self.addTarget(self, action: "textHasChanged", forControlEvents: UIControlEvents.EditingChanged)
    self.addTarget(self, action: "checkTextValid", forControlEvents: UIControlEvents.EditingDidEnd)
}

override func layoutSubviews() {
    super.layoutSubviews()

    // Add error label message
    labelMessage.frame = CGRectMake(10-leftPadding, -10, self.bounds.size.width-20, 24)
    labelMessage.backgroundColor = .blackColor()
    labelMessage.text = "Message goes here"
    labelMessage.font = UIFont.boldSystemFontOfSize(16)
    labelMessage.textColor = .whiteColor()
    labelMessage.textAlignment = .Center
    labelMessage.layer.cornerRadius = 8
    self.leftView = labelMessage
    self.leftViewMode = .Always
    }
}

【问题讨论】:

  • 你不能只创建一个气泡视图并将其作为子视图添加到你的视图控制器吗?
  • 没错,但我正在尝试制作一个自定义 UITextField 来分别处理所有这些。它使表单验证更容易分离所有代码,以便我可以在其他地方使用它。
  • 请将您的代码添加到问题中
  • 您需要创建一个自定义的UIView,其中包含一个文本字段和其他一些内容...而不是UITextView 可能...
  • UITextField 没有为 leftView 提供类似 frame 的属性,所以我们不能改变 leftView 的位置。您可以尝试创建一个自定义视图,比如说 MyCustomTextFieldWithBubbleMessageView,它将包含两个属性:UITextFieldUIView,最后一个视图将是您的自定义气泡消息,也可以是 UILabel。然后你可以使用autolayout 并相应地显示气泡消息。

标签: ios uikit


【解决方案1】:

所以我想我已经想通了。通过使用 leftViewRectForBounds 并返回零 CGRect 我能够消除它的物理存在。

override func leftViewRectForBounds(bounds: CGRect) -> CGRect {
    return CGRect(x: 0, y: 0, width: 0, height: 0)
}

【讨论】:

  • 你试过我建议的代码了吗?它可以工作,并且气泡出现在文本字段中。除非您尝试过代码,否则请不要投反对票。