Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.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
Ios 如何向透明视图添加阴影?_Ios_Quartz Graphics_Transparent_Alpha_Shadow - Fatal编程技术网

Ios 如何向透明视图添加阴影?

Ios 如何向透明视图添加阴影?,ios,quartz-graphics,transparent,alpha,shadow,Ios,Quartz Graphics,Transparent,Alpha,Shadow,我如何复制这种阴影?我的问题是,如果我使用高alpha颜色或clearColor,没有阴影,如果我使用低alpha颜色,我看不到板下的阴影。随着音量的变化(彩色部分),阴影也在移动,因此它不是纯粹的Photoshop 您将有两个图像,一个是彩色图像,另一个是它的阴影 随着彩色部分的扩展,阴影将扩展并增加宽度 做你想做的事情没有一种自然的方式,用你观点的这些属性来尝试一些东西。可能会有什么结果 view.layer.shadowColor = [UIColor colorWithWhite

我如何复制这种阴影?我的问题是,如果我使用高alpha颜色或clearColor,没有阴影,如果我使用低alpha颜色,我看不到板下的阴影。随着音量的变化(彩色部分),阴影也在移动,因此它不是纯粹的Photoshop


您将有两个图像,一个是彩色图像,另一个是它的阴影 随着彩色部分的扩展,阴影将扩展并增加宽度


做你想做的事情没有一种自然的方式,

用你观点的这些属性来尝试一些东西。可能会有什么结果

    view.layer.shadowColor = [UIColor colorWithWhite:.5 alpha:1].CGColor;
    view.layer.shadowRadius = 4.0f;
    view.layer.shadowPath = CGPathCreateWithRect(CGRectMake(0, 0, 50, 50), NULL);
    view.layer.shadowOpacity = 1.0f;
    view.layer.shadowOffset = CGSizeMake(1, 1);

顺便说一句,它在最后应该是cgpathlease(rect),对不起。

我使用UIImageView来提供阴影。我创建了一个1像素宽,12像素高的图像。图像是黑色的,但alpha是从顶部的0.5到底部的0.0的渐变,例如RGBA 1.0,1.0,1.0,0.5->1.0,1.0,1.0,0.0-然后我将UIImageView放置在需要阴影的视图的正下方,并在视图的宽度上水平拉伸它。
当我需要在下面的滚动视图滚动时更改阴影的强度时,我也使用了此选项,方法是更改UIImageView.alpha值

在搜索并没有找到此问题的答案后,我在Swift 5中编写了以下扩展:

extension UIView {
    func makeClearViewWithShadow(
        cornderRadius: CGFloat,
        shadowColor: CGColor,
        shadowOpacity: Float,
        shadowRadius: CGFloat) {

        self.frame = self.frame.insetBy(dx: -shadowRadius * 2,
                                        dy: -shadowRadius * 2)
        self.backgroundColor = .clear
        let shadowView = UIView(frame: CGRect(
            x: shadowRadius * 2,
            y: shadowRadius * 2,
            width: self.frame.width - shadowRadius * 4,
            height: self.frame.height - shadowRadius * 4))
        shadowView.backgroundColor = .black
        shadowView.layer.cornerRadius = cornderRadius
        shadowView.layer.borderWidth = 1.0
        shadowView.layer.borderColor = UIColor.clear.cgColor

        shadowView.layer.shadowColor = shadowColor
        shadowView.layer.shadowOpacity = shadowOpacity
        shadowView.layer.shadowRadius = shadowRadius
        shadowView.layer.masksToBounds = false
        self.addSubview(shadowView)

        let p:CGMutablePath = CGMutablePath()
        p.addRect(self.bounds)
        p.addPath(UIBezierPath(roundedRect: shadowView.frame, cornerRadius: shadowView.layer.cornerRadius).cgPath)

        let s = CAShapeLayer()
        s.path = p
        s.fillRule = CAShapeLayerFillRule.evenOdd

       self.layer.mask = s
    }
}

用法示例:

myView.makeClearViewWithShadow(cornderRadius: 20, shadowColor: UIColor.black.cgColor, shadowOpacity: 0.5, shadowRadius: 30)

我的解决方案是将UIView子类化。即使视图调整了大小,它也可以工作

import UIKit

class ShadowOutsideView: UIView {
  let color: CGColor
  let opacity: Float
  let radius: CGFloat
  let offset: CGSize
  let shadowView = UIView()
  
  init(
    color: CGColor,
    opacity: Float,
    radius: CGFloat,
    offset: CGSize
  ) {
    self.color = color
    self.opacity = opacity
    self.radius = radius
    self.offset = offset
    super.init(frame: CGRect.zero)
    shadowView.frame = bounds
    shadowView.backgroundColor = .black
    shadowView.layer.shadowColor = color
    shadowView.layer.shadowOpacity = opacity
    shadowView.layer.shadowRadius = radius
    shadowView.layer.shadowOffset = offset
    shadowView.layer.masksToBounds = false
    self.addSubview(shadowView)
    
  }
  
  override func layoutSubviews() {
    shadowView.frame = bounds
    let inset = -(max(abs(offset.width), abs(offset.height))+radius) - 10 
    // - 10, had to put 10px extra otherwise it would cut shadow
    let maskFrame = bounds.inset(by: UIEdgeInsets(top: inset, left: inset, bottom: inset, right: inset))
    let p = CGMutablePath()
    p.addRect(maskFrame)
    p.addRect(bounds)
    let s = CAShapeLayer()
    s.path = p
    s.fillRule = .evenOdd
    shadowView.layer.mask = s
  }
}

当视图是透明的-alpha 0时,这不起作用