如何在Swift中自定义uibutton的class?
How to customize uibutton's class in Swift?
我的应用程序中有不同类型的按钮,我希望有一种方法,这样我就不必编写代码来格式化属性标签或在界面生成器中为每个按钮设置插图和背景图像每个视图控制器上的按钮。
我正在考虑做这样的事情:
import UIKit
class whiteButton: UIButton {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
if traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Regular {
contentEdgeInsets.top = 16
contentEdgeInsets.right = 47
contentEdgeInsets.bottom = 16
contentEdgeInsets.left = 47
} else {
contentEdgeInsets.top = 11
contentEdgeInsets.right = 35
contentEdgeInsets.bottom = 11
contentEdgeInsets.left = 35
}
let imageInsets : UIEdgeInsets = UIEdgeInsetsMake(4, 4, 4, 4)
var image = UIImage(named: "white-button.png")
image = image!.resizableImageWithCapInsets(imageInsets)
setBackgroundImage(image, forState: .Normal)
var formattedString = NSMutableAttributedString(string: attributedTitleForState(.Normal)!.string)
let fontDescriptor = UIFontDescriptor(fontAttributes: [UIFontDescriptorNameAttribute : "AvenirNext-Bold"])
var font : UIFont
if traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Regular {
font = UIFont(descriptor: fontDescriptor, size: 18)
} else {
font = UIFont(descriptor: fontDescriptor, size: 12)
}
let attributes = [NSFontAttributeName : font]
formattedString.addAttributes(attributes, range: NSMakeRange(0, formattedString.length))
formattedString.addAttribute(NSKernAttributeName, value: 1.5, range: NSMakeRange(0, formattedString.length))
formattedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.whiteColor(), range: NSMakeRange(0, formattedString.length))
setAttributedTitle(formattedString, forState: .Normal)
}
}
这类作品,但我有以下问题:
- 这样做的好方法吗?我可能会有 3 种不同类型的按钮,所以每个按钮都有一个 subclass。
- 使用
traitCollection
确定大小 class 无效。我该如何修复它(我尝试访问超级视图来获取它,但它是零)?我希望能够根据大小 class. 提供不同的字体大小和插图
最好的方法是为所有不同颜色的按钮制作一个通用按钮 class。初始化新按钮后,您可以设置颜色。
另一种方法是使用带有 UIColor
的指定初始化程序,以便您的代码适应您提供给它的颜色 (init(color:UIColor)
)。
您可以在 didMoveToSuperview
中访问特征集合。
我的应用程序中有不同类型的按钮,我希望有一种方法,这样我就不必编写代码来格式化属性标签或在界面生成器中为每个按钮设置插图和背景图像每个视图控制器上的按钮。
我正在考虑做这样的事情:
import UIKit
class whiteButton: UIButton {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
if traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Regular {
contentEdgeInsets.top = 16
contentEdgeInsets.right = 47
contentEdgeInsets.bottom = 16
contentEdgeInsets.left = 47
} else {
contentEdgeInsets.top = 11
contentEdgeInsets.right = 35
contentEdgeInsets.bottom = 11
contentEdgeInsets.left = 35
}
let imageInsets : UIEdgeInsets = UIEdgeInsetsMake(4, 4, 4, 4)
var image = UIImage(named: "white-button.png")
image = image!.resizableImageWithCapInsets(imageInsets)
setBackgroundImage(image, forState: .Normal)
var formattedString = NSMutableAttributedString(string: attributedTitleForState(.Normal)!.string)
let fontDescriptor = UIFontDescriptor(fontAttributes: [UIFontDescriptorNameAttribute : "AvenirNext-Bold"])
var font : UIFont
if traitCollection.horizontalSizeClass == UIUserInterfaceSizeClass.Regular {
font = UIFont(descriptor: fontDescriptor, size: 18)
} else {
font = UIFont(descriptor: fontDescriptor, size: 12)
}
let attributes = [NSFontAttributeName : font]
formattedString.addAttributes(attributes, range: NSMakeRange(0, formattedString.length))
formattedString.addAttribute(NSKernAttributeName, value: 1.5, range: NSMakeRange(0, formattedString.length))
formattedString.addAttribute(NSForegroundColorAttributeName, value: UIColor.whiteColor(), range: NSMakeRange(0, formattedString.length))
setAttributedTitle(formattedString, forState: .Normal)
}
}
这类作品,但我有以下问题:
- 这样做的好方法吗?我可能会有 3 种不同类型的按钮,所以每个按钮都有一个 subclass。
- 使用
traitCollection
确定大小 class 无效。我该如何修复它(我尝试访问超级视图来获取它,但它是零)?我希望能够根据大小 class. 提供不同的字体大小和插图
最好的方法是为所有不同颜色的按钮制作一个通用按钮 class。初始化新按钮后,您可以设置颜色。
另一种方法是使用带有 UIColor
的指定初始化程序,以便您的代码适应您提供给它的颜色 (init(color:UIColor)
)。
您可以在 didMoveToSuperview
中访问特征集合。