Swift-自定义按钮类阴影大小缩放不起作用
我已经编写了这个自定义按钮类Swift-自定义按钮类阴影大小缩放不起作用,swift,button,constraints,scale,shadow,Swift,Button,Constraints,Scale,Shadow,我已经编写了这个自定义按钮类 class RoundedButton: UIButton { override func awakeFromNib() { layer.cornerRadius = 5 layer.shadowColor = UIColor.black.cgColor layer.shadowOffset = CGSize(width: 0.0, height: 0.0) layer.shadowOpacity = 0.2 layer
class RoundedButton: UIButton {
override func awakeFromNib() {
layer.cornerRadius = 5
layer.shadowColor = UIColor.black.cgColor
layer.shadowOffset = CGSize(width: 0.0, height: 0.0)
layer.shadowOpacity = 0.2
layer.shadowRadius = 1.0
layer.masksToBounds = false
layer.shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: 5).cgPath
layer.contents = center
layer.shouldRasterize = true
layer.rasterizationScale = UIScreen.main.scale
}
}
在我的iPhoneX上,一切都完美契合
但当我使用屏幕更小的设备时,阴影不能根据按钮大小正确缩放
button类本身有问题吗?还是约束问题?我找不到解决方案。您需要更新布局子视图上的阴影(这也可以解决代码在旋转时出现的问题)
希望这对您有所帮助。layer.shadowPath=UIBezierPath(roundedRect:bounds,cornerdius:5)。cgPath。问题就在那里。调用
awakeFromNib()
时,边界是来自Xib的边界。但是,在某一点之后,你的按钮会调整大小以适应屏幕(我猜)。因此,边界
确实发生了变化,但层阴影路径
没有变化。您可以覆盖var frame
,并使用didSet{}
再次将层阴影路径重置为正确的。它可以工作。我把暗道改成了这个layer.shadowPath=UIBezierPath(roundedRect:background.bounds,cornerRadius:5).cgPath
将阴影像按钮一样进行圆角处理。您是否使用了在updateShadow的注释中添加的行?这有什么区别(很抱歉,我想学习)。对updateShadow是的。如果没有此代码,阴影将是矩形的,而不是像按钮一样圆形。
class RoundedButton: UIButton {
override func layoutSubviews() {
super.layoutSubviews()
updateShadow(on: self)
}
func updateShadow(on background: UIView) {
let layer = background.layer
layer.shadowPath = UIBezierPath(rect: background.bounds).cgPath
layer.masksToBounds = false
layer.shadowColor = UIColor.black.cgColor
layer.shadowOffset = CGSize(width: 0, height: 0.0)
layer.shadowRadius = 4
layer.shadowOpacity = 0.22
}
override func awakeFromNib() {
layer.cornerRadius = 5
layer.shadowColor = UIColor.black.cgColor
layer.shadowOffset = CGSize(width: 0.0, height: 0.0)
layer.shadowOpacity = 0.2
layer.shadowRadius = 1.0
layer.masksToBounds = false
layer.shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: 5).cgPath
layer.contents = center
layer.shouldRasterize = true
layer.rasterizationScale = UIScreen.main.scale
}
}