2014-12-29 2 views
2

UITextField 클래스의 rightView 속성을 사용하여 텍스트 필드에 접미사를 제공하려고합니다. 텍스트 필드 편집을 중단 할 때까지 모든 것이 올바르게 작동하는 것 같습니다. 이때 레이블은 UITextField 외부로 이동합니다. 사용되는 코드는 다음과 같습니다 텍스트 필드를 편집 한 후 키보드가 해산 할 때UITextField rightView UITextFiled 외부로 이동

enter image description here

그러나,이 모습 :

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 
    } 
} 

뷰 먼저보기 아래처럼 보이는로드 될 때 이것은 아이폰 OS 7과 8에서 테스트되었습니다

enter image description here

는 둘 다 일을 할 것 : 아래와 같이 같은.

답변

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()을 호출해야합니다. 그러나이 코드는 그대로두기 만합니다.

관련 문제