2017-02-16 90 views
1

我有我創建的自定義UIButton。在按鈕裏面,我有兩個標籤,一個在另一個之上。最重要的是標題,因此它有點大,而最下面的一個更小。 我的目標是讓兩個標籤完全覆蓋整個按鈕,如下所示: 頂部標籤將覆蓋按鈕的頂部2/3部分,底部將覆蓋按鈕的其餘1/3部分。 我的目標離我們不遠,但是我感到奇怪的行爲 - 標籤稍微偏離了按鈕,並且在某些情況下它們消失了(我可以點擊按鈕但看不到標籤)。 這是我的自定義的UIButton參考,我希望這個代碼將幫助人們無論到我的問題:以編程方式在UIButton中設置標籤的框架大小

class ButtonWithStats: UIButton { 

var num: Int 
var name: String 
var nameLabel: UILabel? 
var numLabel: UILabel? 
required init?(coder aDecoder: NSCoder) { 
    // fatalError("init(coder:) has not been implemented") 
    self.num = 0 
    self.name = "" 

    self.numLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 0, height: 0)) //just to init the labels. 
    self.nameLabel = UILabel(frame: CGRect(x: 0, y: 0, width: 0, height: 0)) 
    self.numLabel?.textAlignment = .center 
    self.nameLabel?.textAlignment = .center 
    self.numLabel?.textColor = UIColor.purple 
    self.nameLabel?.textColor = UIColor.black 
    self.numLabel?.font = UIFont.init(name: "Helvetica", size: 11) 
    self.nameLabel?.font = UIFont.init(name: "Helvetica", size: 13) 
    super.init(coder: aDecoder) 
} 

func setButton(numInput: Int, nameInput: String){ 
    self.num = numInput 
    self.name = nameInput 
    self.setLabels() 
} 

private func setLabels(){ 

    numLabel?.text = String(self.num) 
    nameLabel?.text = self.name 
    let widthForName = self.frame.width 
    let heightForName = self.frame.height * 2/3 
    nameLabel?.center = self.center 
    nameLabel?.frame = CGRect(origin: self.frame.origin, size: CGSize(width: widthForName, height: heightForName)) 
    let widthForNum = self.frame.width 
    let heightForNum = self.frame.height * 1/3 
    let yForNum = (self.frame.height * 2/3) //+ self.frame.origin.y 
    numLabel?.frame = CGRect(x: self.frame.origin.x, y: yForNum, width: widthForNum, height: heightForNum) 
    self.addSubview(nameLabel!) 
    self.addSubview(numLabel!) 
    print("@@@@@@@@@@@@@@@@@@@@@@@@@") 
    print("Button \(self.nameLabel?.text) frame is: \(self.frame)") 
    print("Label frame is: \(self.nameLabel?.frame)") 
    print("Num frame is: \(self.numLabel?.frame)") 
    print("@@@@@@@@@@@@@@@@@@@@@@@@@") 
} 
} 

我的控制檯打印這樣的數據:

@@@@@@@@@@@@@@@@@@@@@@@@@ 
Button Optional("button one") frame is: (257.5, 0.0, 64.5, 33.0) 
Label frame is: Optional((257.5, 0.0, 64.5, 22.0)) 
Num frame is: Optional((257.5, 22.0, 64.5, 11.0)) 
@@@@@@@@@@@@@@@@@@@@@@@@@ 
@@@@@@@@@@@@@@@@@@@@@@@@@ 
Button Optional("Button two") frame is: (129.0, 0.0, 64.0, 33.0) 
Label frame is: Optional((129.0, 0.0, 64.0, 22.0)) 
Num frame is: Optional((129.0, 22.0, 64.0, 11.0)) 
@@@@@@@@@@@@@@@@@@@@@@@@@ 
@@@@@@@@@@@@@@@@@@@@@@@@@ 
Button Optional("Button three") frame is: (0.0, 0.0, 64.5, 33.0) 
Label frame is: Optional((0.0, 0.0, 64.5, 22.0)) 
Num frame is: Optional((0.0, 22.0, 64.5, 11.0)) 
@@@@@@@@@@@@@@@@@@@@@@@@@ 

回答

1

而不是增加2個標籤,怎麼樣設置numberOfLinesUIButtonstextLabel

button.titleLabel?.numberOfLines = 2 

或者,添加一個垂直UIStackView,用2個標籤用作子視圖,並設置stackView.frame = button.bounds

let stackView = UIStackView(arrangedSubviews: [numLabel, nameLabel]) 
stackView.frame = buttonView.bounds 
addSubview(stackView) 

可以調整stackView.spacing/layoutMargins等,以將標籤定位爲所需

要使numLabel的高度是nameLabel的兩倍,您可以使用設置約束...

numLabel.heightAnchor.constraint(equalTo: nameLabel.heightAnchor, multiplier: 2) 

我建議你在情節提要/ XIB做到這一點,但如果你需要以編程方式做到這一點,你可能會發現它很有用創建廈門國際銀行來試驗UIStackView設置。

+0

我喜歡堆棧的想法,會更新! – Sharonica

+0

如何使用堆棧視圖將大小設置爲2/3和1/3? – Sharonica

+0

非常感謝! @Ashley Mills – Sharonica

相關問題