编辑:虽然我接受了一个帮助我在运行时正确绘制按钮的答案,但我仍然有其他问题。我怀疑其根源在于
为什么给我的自定义按钮一个出口会干扰它的绘制方式。我还需要知道为什么会这样。
(见下面我的答案)
我有自己的button类,它扩展了UIButton(见下文),并有几个IBenspectable属性,如边框宽度/颜色、角半径,甚至渐变背景的开始/结束颜色。我还使用这些属性以编程方式设置图像和标题的插入,这样我就可以考虑各种屏幕大小。
之前我遇到过一个问题,如果我将情节提要中的“视图为”设备更改为iPhone SE,比如从iPhone SE更改为iPhone 7,然后刷新视图并在物理iPhone SE上运行,它将与iPhone 7的插入一起部署,而不是使用物理设备自己的屏幕大小来计算插入。然而,我
几乎
通过重写
draw
在我的自定义按钮类中。
我现在的问题是
画
方法仅被调用(或似乎仅在以下情况下有效)
按钮没有到的出口
ViewController
它所在的类
.
例如:
*img是一个占位符;插图适合真实的IMG。
右下角的按钮有正确绘制的渐变和角,而其他3个按钮没有。
我已经确认,向此按钮添加一个插座可以使其与其他按钮一样工作,从其他3个按钮中的任何一个删除插座都可以使其正确绘制
.
仅供参考
@IBOutlet weak var button1: UIButton!
@IBOutlet weak var button2: UIButton!
@IBOutlet weak var button3: UIButton!
在
class MyViewController: UIViewController {
公告
此外,我没有忘记在interface builder中为每个按钮设置自定义类。
以下是button类:
import UIKit
@IBDesignable
class ActionButton: UIButton {
override init(frame: CGRect){
super.init(frame: frame)
setupView()
}
required init(coder aDecoder: NSCoder){
super.init(coder: aDecoder)!
setupView()
}
@IBInspectable var cornerRadius: CGFloat = 0{
didSet{
setupView()
}
}
@IBInspectable var startColor: UIColor = UIColor.white{
didSet{
setupView()
}
}
@IBInspectable var endColor: UIColor = UIColor.black{
didSet{
setupView()
}
}
@IBInspectable var borderWidth: CGFloat = 0{
didSet{
self.layer.borderWidth = borderWidth
}
}
@IBInspectable var borderColor: UIColor = UIColor.clear{
didSet{
self.layer.borderColor = borderColor.cgColor
}
}
private func setupView(){
let colors:Array = [startColor.cgColor, endColor.cgColor]
gradientLayer.colors = colors
gradientLayer.cornerRadius = cornerRadius
gradientLayer.endPoint = CGPoint(x: 0.5, y: 1.0)
self.setNeedsDisplay()
}
var gradientLayer: CAGradientLayer{
return layer as! CAGradientLayer
}
override func draw(_ rect: CGRect) {
//Draw image
setupView()
let btnW = self.frame.size.width
let btnH = self.frame.size.height
//Compute and set image insets
let topBtnInset = btnH * (-5/81)
let bottomBtnInset = -4 * topBtnInset
let leftBtnInset = btnW / 4 //btnW * (35/141)
let rightBtnInset = leftBtnInset
self.imageEdgeInsets = UIEdgeInsets(top: topBtnInset, left: leftBtnInset, bottom: bottomBtnInset, right: rightBtnInset)
//Compute and set title insets
let topTitleInset = btnH * (47/81)
let bottomTitleInset = CGFloat(0)
let leftTitleInset = CGFloat(-256) //Image width
let rightTitleInset = CGFloat(0)
self.titleEdgeInsets = UIEdgeInsets(top: topTitleInset, left: leftTitleInset, bottom: bottomTitleInset, right: rightTitleInset)
//Draw text
//Default font size
self.titleLabel?.font = UIFont.boldSystemFont(ofSize: 15)
if(btnH > 81){
self.titleLabel?.font = UIFont.boldSystemFont(ofSize: 17)
}else if(btnH > 97){
self.titleLabel?.font = UIFont.boldSystemFont(ofSize: 20)
}
}
override class var layerClass: AnyClass{
return CAGradientLayer.self
}
}
请忽略我处理插图、字体大小等问题的古怪方式。。
有人知道为什么为按钮指定出口会使其无法正确绘制图层吗?