Я написал этот пользовательский класс кнопок
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
}
}
На моем iPhone X все идеально подходит
Но когда я использую устройство с меньшим экраном, тень неправильно масштабируется в соответствии с размером кнопки.
Есть ли проблема с самим классом кнопки или проблема с ограничениями? Я не могу найти решение.
Вам нужно обновить тень в layoutSubviews (это также должно решить проблемы, которые ваш код, по-видимому, имел с вращением).
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
}
}
Надеюсь, это поможет вам
Оно работает. Я изменил shadowPath на это. layer.shadowPath = UIBezierPath(roundedRect: background.bounds, cornerRadius: 5).cgPath
чтобы сделать тень закругленной, как пуговицы.
Вы использовали строку, которую вы добавили в комментарий в updateShadow? Какая разница (извините за вопрос, я хочу узнать).
Да к обновлению Shadow. Без этого кода тень будет прямоугольной, а не закругленной, как кнопка.
layer.shadowPath = UIBezierPath(roundedRect: bounds, cornerRadius: 5).cgPath
. Проблема есть. Когда вызываетсяawakeFromNib()
,bounds
— это тот, что из Xib. Но через какой-то момент ваша кнопка изменяет размер, чтобы адаптироваться к экрану (я думаю). Итак,bounds
изменился, но неlayer.shadowPath
. Вы можете переопределитьvar frame
и использоватьdidSet{}
, чтобы снова сброситьlayer.shadowPath
на правильный.