2017-07-31 49 views
0

當我嘗試使用我設計的自定義UILabel時,我遇到了一個奇怪的問題。該視圖在故事板中可見並且它的屬性可以正常工作。現在我所做的是在我的Designable類中,我設置了一個名爲isError的屬性,在設置時,我需要在文本的開頭附加*。使用IBDesignable UILabel類時出現奇怪的問題

但是,只要在我的代碼中這樣做,我的Designable屬性不會被使用,並且標籤在設備上沒有正確顯示,它將UILabel的默認屬性添加到文本中。不知道我哪裏錯了。

在VC的自定義標籤代碼

@IBDesignable class KGIBDesignableLabel: UILabel { 

    @IBInspectable var verticalPad: CGFloat = 0 
    @IBInspectable var horizontalPad: CGFloat = 0 
    var isError: Bool = false{ 
     didSet { 
      setup() 
     } 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     setup() 
    } 
    override func layoutSubviews() { 
     super.layoutSubviews() 
     setup() 
    } 
    override func prepareForInterfaceBuilder() { 
     super.prepareForInterfaceBuilder() 
     setup() 
    } 


    func setup(){ 
     if isError{ 
      text="*"+text!; 
      textColor = UIColor.KGColorPalette.errorMessageColor 
     }else{ 
      textColor = UIColor.KGColorPalette.textEntryLabelColor 
      text=text!; 
     } 

     font = UIFont(name: "Helvetica", size: 14) 
     clipsToBounds = true 
     textAlignment = .center 
     numberOfLines = 0 
     lineBreakMode = NSLineBreakMode.byWordWrapping 

     sizeToFit() 
    } 

    override var intrinsicContentSize: CGSize { 
     let superSize = super.intrinsicContentSize 
     let newWidth = superSize.width + superSize.height + (2 * horizontalPad) 
     let newHeight = superSize.height + (2 * verticalPad) 
     let newSize = CGSize(width: newWidth, height: newHeight) 
     return newSize 
    } 
} 

接入代碼

class ViewController: UIViewController { 
    @IBOutlet weak var labelCustom: KGIBDesignableLabel! 



    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 

     labelCustom.isError=true 
     // After adding this^ line it takes default UILabel properties 
    } 
+0

你需要改變值後,再次設立呼叫的方法,如果ISERROR –

+0

的變化值是在設置方法本身內?它可能會遞歸。 –

+0

另外我試圖做的變量的didSet方法。它確實將*添加到文本中,但隨後標籤的大小變得不合適,並且它將文本分割成多行,即使有空間可以更多 –

回答

1

第一個錯誤調用你的layoutSubview方法setup導致從setup連續呼召layoutSubview因爲你是修改中的事物setup導致layoutSubview被稱爲

修復layoutSubviews()

其次在setup調整文字的大小,電流的大小刪除您setup方法錯誤調用sizeToFit()之前計算出你的內在內容大小

修復從您的setup刪除sizeToFit()

第三個錯誤你設置爲widthlabel.intrinsicSize.width + label.intrinsicSize.height + (2 * horizontalPad)明顯,高度是有錯

修復通過這一個'讓newWidth = superSize.width +(2 * horizo​​ntalPad)

替換該行 let newWidth = superSize.width + superSize.height + (2 * horizontalPad)

代碼修改工作

@IBDesignable class KGIBDesignableLabel: UILabel { 

    @IBInspectable var verticalPad: CGFloat = 0 
    @IBInspectable var horizontalPad: CGFloat = 0 
    var isError: Bool = false{ 
     didSet { 
      setup() 
     } 
    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 
     setup() 
    } 

    override func prepareForInterfaceBuilder() { 
     super.prepareForInterfaceBuilder() 
     setup() 
    } 


    func setup(){ 
     if isError{ 
      text="*"+text!; 
      textColor = UIColor.red 
     }else{ 
      textColor = UIColor.black 
      text=text!; 
     } 

     font = UIFont(name: "Helvetica", size: 14) 
     clipsToBounds = true 
     textAlignment = .center 
     numberOfLines = 0 
     lineBreakMode = NSLineBreakMode.byWordWrapping 
    } 

    override var intrinsicContentSize: CGSize { 
     let superSize = super.intrinsicContentSize 
     let newWidth = superSize.width + (2 * horizontalPad) 
     let newHeight = superSize.height + (2 * verticalPad) 
     let newSize = CGSize(width: newWidth, height: newHeight) 
     return newSize 
    } 
} 

這是它如何與10和10看起來值POR垂直和水平填充

enter image description here

希望這有助於

+0

它確實有助於顯示*,但隨後我的文本被分割成多行,即使文本的值只是「標籤」,它會顯示* Lab在一行中,而el在另一行中。 –

+0

@kapsym我會檢查你的設置方法 –

+0

@kapsym你爲什麼要實現內在的內容大小? UILabel默認具有內在內容大小,並且我認爲你的子類只添加了*錯誤或者我錯過了某些東西? –

相關問題