2017-11-11 5 views
1

여기에 텍스트 주위에 패딩 (왼쪽, 오른쪽, 위쪽 및 아래쪽)이있는 레이블이 표시됩니다. (UILabel의 텍스트 패딩

import UIKit 

class LuxLabel: UILabel { 
    //let padding: UIEdgeInsets 
    var padding: UIEdgeInsets = UIEdgeInsets.zero { 
     didSet { 
      self.invalidateIntrinsicContentSize() 
     } 
    }  

    // Create a new PaddingLabel instance programamtically with the desired insets 
    required init(padding: UIEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)) { 
     self.padding = padding 
     super.init(frame: CGRect.zero) 
    } 

    // Create a new PaddingLabel instance programamtically with default insets 
    override init(frame: CGRect) { 
     padding = UIEdgeInsets.zero // set desired insets value according to your needs 
     super.init(frame: frame) 
    } 

    // Create a new PaddingLabel instance from Storyboard with default insets 
    required init?(coder aDecoder: NSCoder) { 
     padding = UIEdgeInsets.zero // set desired insets value according to your needs 
     super.init(coder: aDecoder) 
    } 

    override func drawText(in rect: CGRect) { 
     super.drawText(in: UIEdgeInsetsInsetRect(rect, padding)) 
    } 

    // Override `intrinsicContentSize` property for Auto layout code 
    override var intrinsicContentSize: CGSize { 
     let superContentSize = super.intrinsicContentSize 
     let width = superContentSize.width + padding.left + padding.right 
     let heigth = superContentSize.height + padding.top + padding.bottom 
     return CGSize(width: width, height: heigth) 
    } 
} 

그것은 PaddingLabel을 기반으로합니다 : 이것은 내 하위 클래스 UILabel의에 대한 코드가

입니다 : 이 문제는 SOF에 그들 중 몇 가지를 읽은 후 게시물을 관련있다, 나는 해결책이 here을 제안하여 시도 위의 링크 참조).

대부분 잘 작동하지만 이해할 수없는 몇 가지 이유 때문에 일이 잘못되어 디스플레이가 잘리는 경우가 있습니다. 라벨에 넣어

문자열은 다음과 같습니다 :

은 예입니다. "그것은 사각형 모양과 파란색 색상을하고있다"

let label = LuxLabel(padding: UIEdgeInsets(top: 5, left: 10, bottom: 5, right: 10)) 
label.numberOfLines = 0 

이것은 결과 :

레이블을 작성하는 코드는

enter image description here

나는 위의 두이 줄을 추가하는 경우 :

label.lineBreakMode = .byWordWrapping

결과는 다음과 같습니다

enter image description here

또한 몇 가지 제약 조건을 설정했습니다. 이 모든 것은 95 %의 시간 동안 작동합니다. 누구든지 문제가 무엇인지 볼 수 있습니까? invalidateIntrinsicContentSize를 호출

+0

당신이 '설정이있으세요이 numberOfLines = 0'과'lineBreakMode = .byWordWrapping '? – Priya

+0

numberOfLines = 0을 설정했지만 lineBreakMode = .byWordWrapping을 설정하지 않았습니다. 사실 멀티플 라인이 완벽하게 작동하는 경우가 많습니다. lineBreakMode = .byWordWrapping을 설정하면 문제가 해결되지 않고 내 게시물을 편집하여 이에 대한 세부 정보를 추가하십시오. – Michel

+0

레이블에 대해 정적 높이 제한을 설정 했습니까? – Priya

답변

1

시도 :

var padding: UIEdgeInsets = UIEdgeInsets.zero { 
    didSet { 
     self.invalidateIntrinsicContentSize() 
    } 
} 

편집 :

내가 시도 다른 옵션을 제공합니다. 당신이 트릭을 layoutSubviews에서 intrinsicContentSizeframe size를 업데이트 할 수 있지만 그것을 할 수있는 더 좋은 방법이 있다면 내가 모르는 경우 :

override func layoutSubviews() { 
    super.layoutSubviews() 
    self.frame.size = self.intrinsicContentSize 
} 
+0

필자가 제안한 것처럼 "패딩"을 "var 패딩"으로 대체하면서이 작업을 시도했지만 불행히도 차이는 없습니다. – Michel

+0

@Michel 내일 내가 그것을 재현하려고 노력할 것이다. 그리고 내가 무엇인가 발견하면 나는 당신에게 알릴 것이다. –

+0

문제점을 표시하기 위해 GitHub (https://github.com/zaxonus/TextPad)에서 프로젝트를 만들었습니다. – Michel