【问题标题】:How to create transparent circle in rectangle as Instagram does?如何像 Instagram 一样在矩形中创建透明圆圈?
【发布时间】:2016-01-06 09:05:37
【问题描述】:

现在我有一个矩形,可以在其中调整大小并裁剪图像:

    UIGraphicsBeginImageContextWithOptions((scrollView?.bounds.size)!, true, UIScreen.mainScreen().scale)

    let offset = scrollView?.contentOffset
    CGContextTranslateCTM(UIGraphicsGetCurrentContext(), -(offset?.x)!, -offset!.y)
    scrollView!.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

对于我的整个控制器,请查看Pastebin

所以,我的问题是,我怎样才能在 Instagram 中像这样:

如何添加带有圆心的黑色矩形并像现在一样继续调整图像大小?

【问题讨论】:

标签: ios swift image-processing


【解决方案1】:

使用此代码,这将完美运行。

    let radius : CGFloat = 50;//make it dynamic as per frame of your imageView
    let path = UIBezierPath(roundedRect: CGRectMake(0, 0, 100, 100) , cornerRadius: 0);//make it dynamic as per frame of your imageview
    let circlePath = UIBezierPath(roundedRect: CGRectMake(0, 0, 2.0*radius , 2.0*radius) , cornerRadius: radius)

    path.appendPath(circlePath);
    path.usesEvenOddFillRule = true;

    let fillLayer = CAShapeLayer();
    fillLayer.path = path.CGPath;
    fillLayer.fillRule = kCAFillRuleEvenOdd;
    fillLayer.fillColor = UIColor.blackColor().CGColor;
    fillLayer.opacity = 0.4;
    self.imageView.layer.addSublayer(fillLayer)

【讨论】:

    【解决方案2】:

    创建一个CALayer的子类

    以下代码

    import UIKit
    
    class GradiantLayer: CALayer {
        func frameSetup() -> CGRect {
            let frameWidth:CGFloat = superlayer!.frame.width
            let frameHeight:CGFloat = superlayer!.frame.height
            let frame = CGRectMake(0, 0, frameWidth, frameHeight)
            return frame
        }
    
        override func drawInContext(ctx: CGContextRef) {
    
            let locations :[CGFloat] = [ 0.5, 0.5,1.0 ]
            let colors = [UIColor.clearColor().CGColor,UIColor(red: 0, green: 0, blue: 0, alpha: 0.2).CGColor,UIColor(red: 0, green: 0, blue: 0, alpha: 0.2).CGColor]
            let colorspace : CGColorSpaceRef = CGColorSpaceCreateDeviceRGB()!
    
            let gradCenter: CGPoint = CGPointMake(self.bounds.size.width / 2, self.bounds.size.height / 2)
    
            let gradiant2: CGGradientRef = CGGradientCreateWithColors(colorspace, colors as CFArrayRef, locations)!
    
            CGContextDrawRadialGradient(ctx, gradiant2, gradCenter, 0, gradCenter, self.bounds.size.width, CGGradientDrawingOptions.DrawsAfterEndLocation)
    
        }
    
    }
    

    现在在viewcontroller的viewDidLoad中使用下面的方法添加这个外圈

    override func viewDidLoad() {
        super.viewDidLoad()
        let gradiant:GradiantLayer = GradiantLayer()
        scrollView?.layer.addSublayer(gradiant)
        gradiant.frame = gradiant.frameSetup()
        gradiant.setNeedsDisplay()
    }
    

    【讨论】:

      【解决方案3】:

      请参考以下答案,希望对你有用。
      Drawing a transparent circle on top of a UIImage - iPhone SDK

      实际上主要思想是创建具有半透明背景的正方形UIView,并在先前创建的正方形UIView上绘制具有一定半径和透明背景的UIView

      【讨论】:

        【解决方案4】:

        您可以使用 2x CALayer 轻松完成此操作。

        CALayer 添加到您的视图中,这是您希望外部遮罩的颜色。您可能需要将此层放在前面(请参阅此处:https://stackoverflow.com/a/11015144/78496

        然后在新的 CALayer 上,将其 mask 属性设置为 CAShapeLayer,并用一个完全白色的圆圈作为其 path

        您可以在此处查看如何创建循环CAShapeLayerhttps://stackoverflow.com/a/28442517/78496

        【讨论】:

          猜你喜欢
          • 2016-08-14
          • 2017-03-14
          • 2020-10-09
          • 2014-12-26
          • 1970-01-01
          • 1970-01-01
          • 2016-06-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多