iphone - 在横向和纵向模式下向 UIView 添加阴影
问题描述
我正在尝试向 UIView 添加阴影。这是我添加阴影的代码。
func addDropShadow() {
layer.cornerRadius = 5.0
layer.masksToBounds = false
layer.shadowColor = UIColor.darkGray.cgColor
layer.shadowOpacity = 0.5
layer.shadowOffset = CGSize(width: 2, height: 2)
layer.shadowRadius = 4
layer.shadowPath = UIBezierPath(rect: bounds).cgPath
layer.shouldRasterize = true
layer.rasterizationScale = UIScreen.main.scale
}
如果设备处于纵向模式,它可以正常工作,但在横向模式下,阴影要么被剪掉
当我再次将设备旋转回横向时,阴影路径移出屏幕。
我认为这可能是由于视图的方向改变框架也得到了更新。所以我在 viewDidLayoutSubviews 方法中更新了阴影路径属性。但行为保持不变。
这是我的代码
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.dropShadowView.layer.shadowPath = UIBezierPath(rect: self.dropShadowView.bounds).cgPath
}
我在这里做错了吗?
解决方案
UIView
如果你将它作为一个子类并覆盖,你会发现管理阴影会容易得多layoutSubviews()
:
@IBDesignable
class SimpleShadowedView: UIView {
override func layoutSubviews() {
super.layoutSubviews()
layer.cornerRadius = 5.0
layer.masksToBounds = false
layer.shadowColor = UIColor.darkGray.cgColor
layer.shadowOpacity = 0.5
layer.shadowOffset = CGSize(width: 2, height: 2)
layer.shadowRadius = 4
layer.shadowPath = UIBezierPath(rect: bounds).cgPath
layer.shouldRasterize = true
layer.rasterizationScale = UIScreen.main.scale
}
}
另请注意,通过添加@IBDesignable
名称,您还可以在设计时查看输出。
在 Storyboard / Interface builder 中将视图的自定义类设置为SimpleShadowedView
:
它将在运行时显示:
如果您选择Editor -> Refresh All Views
(或,Automatically Refresh Views
),您还将在设计时看到它。
推荐阅读
- java - 在 Android 中使用其列表值对 HashMap 进行排序(Map
>) - css - Firefox 和 chrome 中不同尺寸的跨浏览器显示问题(仅限移动设备)
- flutter - 运行“颤振医生--android-licenses”时出错
- c# - NetworkStream 只能在发送的 NetworkStream 关闭或处置后才能读取数据
- log4j2 - Log4j2 无法删除老化的日志文件
- android - 将用户导航到可以关闭省电模式的屏幕
- d3.js - 使用 d3.js 创建多柱形图
- rest - 休息api中的Sabre VOID票
- docker - NestJs - Docker 的两个微服务之间的通信
- ios - 我们能否像在 Swift 中使用 Equatable 协议覆盖 operator == 一样覆盖 switch case 行为