当前位置: 首页 > 面试题库 >

Swift-在阴影层上切孔

淳于新
2023-03-14
问题内容

我想在UIView的阴影层中“切出一个洞”,Swift3,iOS

我有一个容器(UIView),有2个子容器:

  • 一个UIImageView
  • 该图像上方有一个UIView(“叠加层”)

我想给覆盖了一层阴影,并切出阴影的内矩形,创建一个辉光像在ImageView的边缘效果
,这是至关重要的辉光插图,由于图像拍摄屏幕宽度
我的代码至今:

let glowView = UIView(frame: CGRect(x: 0, y: 0, width: imageWidth, height: imageHeight))
glowView.layer.shadowPath = UIBezierPath(roundedRect: container.bounds, cornerRadius: 4.0).cgPath
glowView.layer.shouldRasterize = true
glowView.layer.rasterizationScale = UIScreen.main.scale
glowView.layer.shadowOffset = CGSize(width: 1.0, height: 1.0)
glowView.layer.shadowOpacity = 0.4

container.addSubview(imageView)
container.addSubview(glowView)

现在的结果如下所示:

图片

现在,我想剪掉较暗的内部部分,以便仅保留边缘的阴影。
知道如何实现这一点吗?


问题答案:

这些天来很容易做到这一点:

在此处输入图片说明

这就是全部

import UIKit
class GlowBox: UIView {

    override func layoutSubviews() {
        super.layoutSubviews()

        backgroundColor = .clear
        layer.shadowOpacity = 1
        layer.shadowColor = UIColor.red.cgColor
        layer.shadowOffset = CGSize(width: 0, height: 0)
        layer.shadowRadius = 3

        let p = UIBezierPath(
             roundedRect: bounds.insetBy(dx: 0, dy: 0),
             cornerRadius: 4)
        let hole = UIBezierPath(
             roundedRect: bounds.insetBy(dx: 2, dy: 2),
             cornerRadius: 3)
             .reversing()
        p.append(hole)
        layer.shadowPath = p.cgPath
    }
}

一个非常方便的提示:

当您添加(即 .append)两个类似的贝塞尔曲线路径时…

第二个必须是“正常”或“反转”。

请注意结尾处的代码行:

             .reversing()

像大多数程序员一样,如果在不同情况下应该是“正常”或“逆向” , 我将永远无法记住

简单的解决方案

很简单,两者都尝试!

只需在有或没有的情况下尝试 .reversing()

它将以一种或另一种方式工作!:)



 类似资料:
  • 阴影 Unity 的灯光可以将 阴影 从一个游戏对象投射到自身的其他部分或是附近的其他游戏对象上。阴影以『扁平』的方式体现游戏对象的尺寸和位置,因此可以为场景添加一定程度的深度和真实感。 场景视图中的游戏对象正在投射阴影 阴影如何工作? 考虑一种最简单的情况,在场景中只有单个光源。光线从光源出发并沿着直线传播,最终可能会碰撞到场景中的游戏对象。一旦光线碰撞到某个游戏对象,光线将无法继续传播和照亮前

  • 我在这里检查了一大堆答案,仍然没有骰子。Android Studio预览显示阴影,但没有显示5.1.1 Nexus 7。 这是我的XML 所以我使用了cardUseCompatPadding(也在这里),检查了文档,确保卡片有边距。。。。没有骰子。 我在https://gist.github.com/tigerhawkvok/0ca3d1f402afa29642d5发布了整个XML文件。 帮助

  • 当我切换到我制作的UIViewController时,我遇到了一个奇怪的问题。ViewController B(我要访问的)有一个UIView,它使用TransitionCoordinator和约束向下滑动,但它在右侧显示灰色阴影,如下所示: 完成segue后,它将返回半透明状态,并通过UINavigationBar以漂亮的模糊显示蓝色UIView。 此灰色阴影很可能是由于我从中选择的UITabl

  • 我目前正在重新制作几年前在Swing/AWT中制作的一个游戏,这次使用的是JavaFX。我目前的困境是,原来的游戏有一个“手电筒”,在其中我首先创建了一个空白的黑色层,然后我将创建一个多边形,并用混合模式将其从该层中减去。从那里开始,图层被绘制成透明的,给人一种一切都是黑暗的,玩家拿着手电筒的感觉。 我不知道如何在JavaFX中实现这一点。我想我可以创建一个空白的黑色图像,并且有一些方法可以从中创

  • 主要内容:1. text-shadow,2. box-shadow在网页设计中常常要使用到阴影效果,通过阴影效果可以很好的突出一个元素,在 CSS3 出现之前,我们想要为文本或者元素添加阴影效果需要借助图像才能实现,很不方便。而 CSS3 出现之后,我们通过 text-shadow 和 box-shadow 两个属性就可以为文本或元素添加阴影效果,不需要借助任何图像。 1. text-shadow 使用 CSS 的 text-shadow 属性我们可以为文本设置

  • 注意: Internet Explorer和Safari不支持SVG滤镜! <defs> 和 <filter> 所有互联网的SVG滤镜定义在<defs>元素中。<defs>元素定义短并含有特殊元素(如滤镜)定义。 <filter>标签用来定义SVG滤镜。<filter>标签使用必需的id属性来定义向图形应用哪个滤镜? SVG <feOffset> 实例 1 <feOffset>元素是用于创建阴影效