2014-12-29 35 views
2

我試圖使用UITextField類的rightView屬性爲文本字段提供後綴。這一切都似乎正常工作,直到我停止編輯文本字段,此時標籤移動到UITextField以外。使用的代碼是:UITextField rightView移到UITextFiled外

class TextFieldWithSuffix: UITextField { 
    var suffix: String? { 
     didSet { 
      let value = self.suffix ?? "" 
      let label = UILabel(frame: CGRectZero) 
      label.font = self.font 
      label.text = value 

      self.rightView = label 
      self.rightViewMode = .Always 
     } 
    } 

    override func rightViewRectForBounds(bounds: CGRect) -> CGRect { 
     var rightViewRect = super.rightViewRectForBounds(bounds) 
     if let suffix = self.suffix { 
      let suffixSize = NSString(string: suffix).sizeWithAttributes([NSFontAttributeName: self.font]) 
      rightViewRect.size = suffixSize 
     } 
     return rightViewRect 
    } 
} 

當視圖第一次加載觀點看起來象下面這樣:

enter image description here

然而,當文本字段已經被編輯過,然後在鍵盤駁回,它看起來象下面這樣:

enter image description here

這已在iOS 7和8以及測試的兩種似乎在做的相同。

回答

1

原來的問題是再次設置rightView屬性,編輯完成時發生了這種情況。我發現下面的版本解決了該問題:

class TextFieldWithSuffix: UITextField { 
    var suffix: String? { 
     didSet { 
      let value = self.suffix ?? "" 

      let suffixLabel = UILabel(frame: CGRectZero) 
      suffixLabel.font = self.font 
      suffixLabel.updateFontStyle() 
      suffixLabel.text = value 

      self.rightView = nil 
      self.rightView = suffixLabel 
      self.rightViewMode = .Always 

      self.setNeedsLayout() 
      self.layoutIfNeeded() 
     } 
    } 

    override func rightViewRectForBounds(bounds: CGRect) -> CGRect { 
     var rightViewRect = super.rightViewRectForBounds(bounds) 
     if let suffix = self.suffix { 
      let suffixSize = NSString(string: suffix).sizeWithAttributes([NSFontAttributeName: self.font]) 
      rightViewRect.size = suffixSize 
     } 
     return rightViewRect 
    } 
} 

希望這會幫助別人。如果你這麼做的話,你應該更新標籤的價值,並打電話給setNeedsLayout()layoutIfNeeded(),但是這個工作,所以我只是保持原樣。