Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift-自定义按钮类阴影大小缩放不起作用_Swift_Button_Constraints_Scale_Shadow - Fatal编程技术网

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
}
}