使用系统字体、粗体和字距微调子类 UIButton
Subclass UIButton with system font, bold, and kerning
您必须使用属性文本来进行字距调整。但。另一方面,您无法在 IB 属性文本菜单中获取系统字体。
我如何(在代码中)制作一个 UIButton
具有
- 系统字体,粗细加粗
- 尺码 11
- kern 属性设置为 -2
理想情况下,它会从 IB 中的纯文本标题中收集按钮的文本。但是如果必须在代码中设置文本就可以了。
class NiftyButton: UIButton {
????
}
通常我会像这样初始化 UIButton ..但我什至不知道这是否是执行此操作的最佳位置? (你不能在 layoutSubviews 中这样做,因为它当然会循环。)
class InitializeyButton: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
common()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
common()
}
func common() {
...
}
}
如何在代码中实现...
- 系统字体,粗细加粗
- 尺码 11
- kern 属性设置为 -2
这里是 class 您可以用来获得所需结果的方法:
class InitializeyButton: UIButton {
@IBInspectable var spacing:CGFloat = 0 {
didSet {
updateTitleOfLabel()
}
}
override func setTitle(_ title: String?, for state: UIControl.State) {
let color = super.titleColor(for: state) ?? UIColor.black
let attributedTitle = NSAttributedString(
string: title ?? "",
attributes: [NSAttributedString.Key.kern: spacing,
NSAttributedString.Key.foregroundColor: color,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: self.titleLabel?.font.pointSize ?? 11, weight: .bold) ])
super.setAttributedTitle(attributedTitle, for: state)
}
private func updateTitleOfLabel() {
let states:[UIControl.State] = [.normal, .highlighted, .selected, .disabled]
for state in states {
let currentText = super.title(for: state)
self.setTitle(currentText, for: state)
}
}
}
Copy-paste 系统字体 + 字距调整的 UIButton:
我整理了Jawad的极品资料:
首先,在启动时,您必须创建属性标题:
import UIKit
class SmallChatButton: UIIButton { // (note the extra "I" !!)
override func common() {
super.common()
backgroundColor = .your corporate color
contentEdgeInsets = UIEdgeInsets(top: 7, left: 11, bottom: 7, right: 11)
titles()
}
private func titles() {
let states: [UIControl.State] = [.normal, .highlighted, .selected, .disabled]
for state in states {
let currentText = super.title(for: state)
setTitle(currentText, for: state)
}
}
所以要实现那个..
override func setTitle(_ title: String?, for state: UIControl.State) {
let _f = UIFont.systemFont(ofSize: 10, weight: .heavy)
let attributedTitle = NSAttributedString(
string: title ?? "Click",
attributes: [
NSAttributedString.Key.kern: -0.5,
NSAttributedString.Key.foregroundColor: UIColor.white,
NSAttributedString.Key.font: _f
])
setAttributedTitle(attributedTitle, for: state)
}
override func layoutSubviews() { // example of rounded corners
super.layoutSubviews()
layer.cornerRadius = bounds.height / 2.0
clipsToBounds = true
}
}
请注意,“-0.5”的紧排大约是大多数排版人员想要的典型“略紧字体”。
全部大写、稍微加粗的字体或小字体看起来不错。 Apple 的测量系统不同于排版师使用的任何系统,因此,您只需更改它,直到排版师对您的应用程序感到满意为止。
什么是UIIButton
(注意多出来的“我”!!)
在任何项目中,您不可避免地需要一个具有“I”初始值设定项的 UIButton,因此您可能会拥有:
import UIKit
class UIIButton: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
common()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
common()
}
func common() {
}
}
(令人惊讶的是,在 iOS 中必须执行上述所有操作才能“调整系统字体”!)
您必须使用属性文本来进行字距调整。但。另一方面,您无法在 IB 属性文本菜单中获取系统字体。
我如何(在代码中)制作一个 UIButton
具有
- 系统字体,粗细加粗
- 尺码 11
- kern 属性设置为 -2
理想情况下,它会从 IB 中的纯文本标题中收集按钮的文本。但是如果必须在代码中设置文本就可以了。
class NiftyButton: UIButton {
????
}
通常我会像这样初始化 UIButton ..但我什至不知道这是否是执行此操作的最佳位置? (你不能在 layoutSubviews 中这样做,因为它当然会循环。)
class InitializeyButton: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
common()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
common()
}
func common() {
...
}
}
如何在代码中实现...
- 系统字体,粗细加粗
- 尺码 11
- kern 属性设置为 -2
这里是 class 您可以用来获得所需结果的方法:
class InitializeyButton: UIButton {
@IBInspectable var spacing:CGFloat = 0 {
didSet {
updateTitleOfLabel()
}
}
override func setTitle(_ title: String?, for state: UIControl.State) {
let color = super.titleColor(for: state) ?? UIColor.black
let attributedTitle = NSAttributedString(
string: title ?? "",
attributes: [NSAttributedString.Key.kern: spacing,
NSAttributedString.Key.foregroundColor: color,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: self.titleLabel?.font.pointSize ?? 11, weight: .bold) ])
super.setAttributedTitle(attributedTitle, for: state)
}
private func updateTitleOfLabel() {
let states:[UIControl.State] = [.normal, .highlighted, .selected, .disabled]
for state in states {
let currentText = super.title(for: state)
self.setTitle(currentText, for: state)
}
}
}
Copy-paste 系统字体 + 字距调整的 UIButton:
我整理了Jawad的极品资料:
首先,在启动时,您必须创建属性标题:
import UIKit
class SmallChatButton: UIIButton { // (note the extra "I" !!)
override func common() {
super.common()
backgroundColor = .your corporate color
contentEdgeInsets = UIEdgeInsets(top: 7, left: 11, bottom: 7, right: 11)
titles()
}
private func titles() {
let states: [UIControl.State] = [.normal, .highlighted, .selected, .disabled]
for state in states {
let currentText = super.title(for: state)
setTitle(currentText, for: state)
}
}
所以要实现那个..
override func setTitle(_ title: String?, for state: UIControl.State) {
let _f = UIFont.systemFont(ofSize: 10, weight: .heavy)
let attributedTitle = NSAttributedString(
string: title ?? "Click",
attributes: [
NSAttributedString.Key.kern: -0.5,
NSAttributedString.Key.foregroundColor: UIColor.white,
NSAttributedString.Key.font: _f
])
setAttributedTitle(attributedTitle, for: state)
}
override func layoutSubviews() { // example of rounded corners
super.layoutSubviews()
layer.cornerRadius = bounds.height / 2.0
clipsToBounds = true
}
}
请注意,“-0.5”的紧排大约是大多数排版人员想要的典型“略紧字体”。
全部大写、稍微加粗的字体或小字体看起来不错。 Apple 的测量系统不同于排版师使用的任何系统,因此,您只需更改它,直到排版师对您的应用程序感到满意为止。
什么是UIIButton
(注意多出来的“我”!!)
在任何项目中,您不可避免地需要一个具有“I”初始值设定项的 UIButton,因此您可能会拥有:
import UIKit
class UIIButton: UIButton {
override init(frame: CGRect) {
super.init(frame: frame)
common()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
common()
}
func common() {
}
}
(令人惊讶的是,在 iOS 中必须执行上述所有操作才能“调整系统字体”!)