IOS UIButton (DLRadioButton) 高度不依赖于标题标签文本大小
IOS UIButton (DLRadioButton) height doesn't depend on title label text size
我有 3 个单选按钮 DLRadioButton(UIButton 继承者)。
它们一个接一个地放在一起。
我希望按钮高度增加是标题标签高度增加。我设置行数 = 0:
btn1.titleLabel?.numberOfLines = 0
btn2.titleLabel?.numberOfLines = 0
btn3.titleLabel?.numberOfLines = 0
根据需要获取尽可能多的行。但它最多只能工作 2 行。如果文本大小很大,按钮高度不会增加并且标签会重叠。
我该如何解决?
您需要编辑 DLRadioButton
class 的来源。
这是一个快速示例更改。
注意:此更改仅适用于具有多行按钮标签的左侧图标位置。右图标位置仍然适用于单行按钮。
在DLRadioButton.m
库源中,添加这个方法:
- (CGSize)intrinsicContentSize {
[self.titleLabel sizeToFit];
CGSize sz = self.titleLabel.bounds.size;
sz.height += self.titleEdgeInsets.top + self.titleEdgeInsets.bottom;
sz.width += self.icon.size.width + self.titleEdgeInsets.left + self.titleEdgeInsets.right + self.marginWidth;
return sz;
}
然后您可以像这样布置您的按钮(或者从代码生成它们,没关系):
和示例 Swift 视图控制器代码:
class MultilineViewController: UIViewController {
@IBOutlet var qTitle: UILabel!
@IBOutlet var button1: DLRadioButton!
@IBOutlet var button2: DLRadioButton!
@IBOutlet var button3: DLRadioButton!
override func viewDidLoad() {
super.viewDidLoad()
for btn in [button1, button2, button3] {
btn?.titleLabel?.lineBreakMode = .byWordWrapping
}
}
}
对于这个结果(我刚刚在示例应用程序的标签栏中添加了另一个 VC):
"radio button circle" 将垂直居中放置。如果您希望它与文本的第一行对齐,则需要进行一些额外的编辑。
如果您不想使用此 DLRadioButton
库的其他功能(例如图标图像、右图标定位、多 select 复选框组等),您可以想查看其他实现(其中有很多)或编写自己的实现。
import DLRadioButton
class CustomDLRadioButton: DLRadioButton {
override var intrinsicContentSize: CGSize {
if let label = self.titleLabel {
label.sizeToFit()
var sz = label.bounds.size;
sz.height += self.titleEdgeInsets.top + self.titleEdgeInsets.bottom
sz.width += self.icon.size.width + self.titleEdgeInsets.left + self.titleEdgeInsets.right + self.marginWidth
return sz
}
return CGSize.zero
}
}
let button = CustomDLRadioButton()
button.titleLabel?.lineBreakMode = .byWordWrapping
这是已接受答案的 Swift 版本。您可以子类化 DLRadioButton 方法并覆盖 intrinsicContentSize 属性,它对我有用。
我有 3 个单选按钮 DLRadioButton(UIButton 继承者)。 它们一个接一个地放在一起。
我希望按钮高度增加是标题标签高度增加。我设置行数 = 0:
btn1.titleLabel?.numberOfLines = 0
btn2.titleLabel?.numberOfLines = 0
btn3.titleLabel?.numberOfLines = 0
根据需要获取尽可能多的行。但它最多只能工作 2 行。如果文本大小很大,按钮高度不会增加并且标签会重叠。
我该如何解决?
您需要编辑 DLRadioButton
class 的来源。
这是一个快速示例更改。
注意:此更改仅适用于具有多行按钮标签的左侧图标位置。右图标位置仍然适用于单行按钮。
在DLRadioButton.m
库源中,添加这个方法:
- (CGSize)intrinsicContentSize {
[self.titleLabel sizeToFit];
CGSize sz = self.titleLabel.bounds.size;
sz.height += self.titleEdgeInsets.top + self.titleEdgeInsets.bottom;
sz.width += self.icon.size.width + self.titleEdgeInsets.left + self.titleEdgeInsets.right + self.marginWidth;
return sz;
}
然后您可以像这样布置您的按钮(或者从代码生成它们,没关系):
和示例 Swift 视图控制器代码:
class MultilineViewController: UIViewController {
@IBOutlet var qTitle: UILabel!
@IBOutlet var button1: DLRadioButton!
@IBOutlet var button2: DLRadioButton!
@IBOutlet var button3: DLRadioButton!
override func viewDidLoad() {
super.viewDidLoad()
for btn in [button1, button2, button3] {
btn?.titleLabel?.lineBreakMode = .byWordWrapping
}
}
}
对于这个结果(我刚刚在示例应用程序的标签栏中添加了另一个 VC):
"radio button circle" 将垂直居中放置。如果您希望它与文本的第一行对齐,则需要进行一些额外的编辑。
如果您不想使用此 DLRadioButton
库的其他功能(例如图标图像、右图标定位、多 select 复选框组等),您可以想查看其他实现(其中有很多)或编写自己的实现。
import DLRadioButton
class CustomDLRadioButton: DLRadioButton {
override var intrinsicContentSize: CGSize {
if let label = self.titleLabel {
label.sizeToFit()
var sz = label.bounds.size;
sz.height += self.titleEdgeInsets.top + self.titleEdgeInsets.bottom
sz.width += self.icon.size.width + self.titleEdgeInsets.left + self.titleEdgeInsets.right + self.marginWidth
return sz
}
return CGSize.zero
}
}
let button = CustomDLRadioButton()
button.titleLabel?.lineBreakMode = .byWordWrapping
这是已接受答案的 Swift 版本。您可以子类化 DLRadioButton 方法并覆盖 intrinsicContentSize 属性,它对我有用。