这里的角落正在工作,但阴影在 iOS 9 和 10 中不起作用

Posted

技术标签:

【中文标题】这里的角落正在工作,但阴影在 iOS 9 和 10 中不起作用【英文标题】:Here corner is working but shadow is not work in iOS 9 and 10 【发布时间】:2018-05-15 09:26:13 【问题描述】:

这里的角落可以工作,但阴影在 ios 9 和 10 中不起作用

和 iOS 11 都运行良好

 viewBlueMe.chatCellDesign([.topLeft,.bottomLeft,.topRight], [.layerMinXMinYCorner,.layerMinXMaxYCorner,.layerMaxXMinYCorner], radius: 5)

扩展名:

    extension UIView 
    func chatCellDesign(_ corners:UIRectCorner,_ cormerMask:CACornerMask, radius: CGFloat) 

        if #available(iOS 11.0, *)
            self.clipsToBounds = false
            self.layer.cornerRadius = radius
            self.layer.maskedCorners = cormerMask

            self.layer.shadowColor = UIColor.gray.cgColor
            self.layer.shadowOpacity = 1
            self.layer.shadowOffset = CGSize.zero
            self.layer.shadowRadius = 5
        else
            let rectShape = CAShapeLayer()
            rectShape.bounds = self.frame
            rectShape.position = self.center
            rectShape.path = UIBezierPath(roundedRect: self.bounds,    byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius)).cgPath
            self.layer.mask = rectShape

            // FIXME: THIS CODE IS NOT WORK
            self.layer.shadowColor = UIColor.gray.cgColor
            self.layer.shadowOpacity = 1
            self.layer.shadowOffset = CGSize.zero
            self.layer.shadowRadius = 5


        
    

我在 iOS 9 和 10 中需要这种类型的输出,这也是 iOS11

提前致谢

【问题讨论】:

试试 self.layer.masksToBounds = true 就像***.com/questions/1509547/… 你应该创建一个超级视图,你可以应用阴影,在子视图上你可以应用圆角半径,这样它就可以工作了 @FredericP 已经尝试过了 @PrashantTukadiya 是的,这是解决方案,但这里 ios 11 工作,所以我想为什么我要查看 2 个视图 @Harshil 让我解释一下,角半径要求剪辑绑定为真(试试看)然后你只会得到角半径,只有阴影会被剪裁,所以它不可见。如果您将剪辑应用于绑定 false,那么您会得到阴影,但您的子视图的边缘将像您现在一样显示。这就是为什么我们需要两个视图,但是这个问题是重复的,并且有很多答案可以解释同一件事 【参考方案1】:

创建一个outerview 并将您的UILabel 放入其中,请在下面找到详细信息,

outerView.layer.cornerRadius = 5.0
outerView.layer.shadowColor = UIColor.black.cgColor
outerView.layer.shadowOffset = CGSize.zero
outerView.layer.shadowOpacity = 0.2
outerView.layer.shadowRadius = 5.0

更新

见下图,

这是IBOutlets

@IBOutlet weak var tmpView: UIView!
@IBOutlet weak var innerView: UIView!

你可以这样做,

innerView.roundCorners([.topLeft, .topRight, .bottomLeft], radius: 5)
tmpView.layer.shadowColor = UIColor.black.cgColor
tmpView.layer.shadowOffset = CGSize.zero
tmpView.layer.shadowOpacity = 0.2
tmpView.layer.shadowRadius = 10.0

在这里找到 UIView 扩展,

extension UIView 
    func roundCorners(_ corners: UIRectCorner, radius: CGFloat) 
        let path = UIBezierPath(roundedRect: self.bounds, byRoundingCorners: corners, cornerRadii: CGSize(width: radius, height: radius))
        let mask = CAShapeLayer()
        mask.path = path.cgPath
        self.layer.mask = mask
    

这将为您提供以下输出,

仅供参考。玩弄 shadow 属性以获得您想要的精确输出。

【讨论】:

如果你仔细观察,你会发现 3 个角有半径,一个没有半径。 @PPL 这里的 iOS 11 它只能使用单一视图和内部标签,所以为什么它不能在 iOS 9 和 10 中工作 @PPL 你的解决方案很好,但我正在尝试使用单一视图和标签 我的问题是如何在单视图中同时提供角落收音机和阴影,不要使用 2 视图,因为它已经在 iOS 11 中工作,所以我想对 ios 11 和 9 使用相同的布局

以上是关于这里的角落正在工作,但阴影在 iOS 9 和 10 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

角落不是UILabel和UIbutton ios swift的圆形

在 iOS 中应用模糊滤镜时如何从图像中删除黑色阴影矩形?

使用 UIBezierPath 将半径设置为某些角并向自定义 UIButton 添加阴影

在 iOS 上使用 setBackgroundImage 时移除 UIButton 的阴影

HTML CSS提升角落阴影

具有角半径和阴影的 SWIFT UITableViewCell