Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.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
Iphone 我怎么能';切割';图像中的透明孔?_Iphone_Objective C_Cocoa Touch_Uiimage - Fatal编程技术网

Iphone 我怎么能';切割';图像中的透明孔?

Iphone 我怎么能';切割';图像中的透明孔?,iphone,objective-c,cocoa-touch,uiimage,Iphone,Objective C,Cocoa Touch,Uiimage,我试图在UIImage中剪切一个透明的正方形,但是我真的不知道从哪里/如何开始 任何帮助都将不胜感激 谢谢 假设您的图像正在视图中显示—可能是UIImageView。然后,我们可以通过遮罩视图的图层在该视图中打一个矩形孔。每个视图都有一个层。我们将在该视图的层上应用一个掩码,它本身就是一个包含图像的层,我们将在代码中生成该图像。图像将是黑色的,除了一个清晰的矩形在中间的某个地方。该透明矩形将导致图像视图中出现孔 因此,让self.iv成为这个UIImageView。尝试运行以下代码: CGRec

我试图在UIImage中剪切一个透明的正方形,但是我真的不知道从哪里/如何开始

任何帮助都将不胜感激


谢谢

假设您的图像正在视图中显示—可能是UIImageView。然后,我们可以通过遮罩视图的图层在该视图中打一个矩形孔。每个视图都有一个层。我们将在该视图的层上应用一个掩码,它本身就是一个包含图像的层,我们将在代码中生成该图像。图像将是黑色的,除了一个清晰的矩形在中间的某个地方。该透明矩形将导致图像视图中出现孔

因此,让
self.iv
成为这个UIImageView。尝试运行以下代码:

CGRect r = self.iv.bounds;
CGRect r2 = CGRectMake(20,20,40,40); // adjust this as desired!
UIGraphicsBeginImageContextWithOptions(r.size, NO, 0);
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextAddRect(c, r2);
CGContextAddRect(c, r);
CGContextEOClip(c);
CGContextSetFillColorWithColor(c, [UIColor blackColor].CGColor);
CGContextFillRect(c, r);
UIImage* maskim = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CALayer* mask = [CALayer layer];
mask.frame = r;
mask.contents = (id)maskim.CGImage;
self.iv.layer.mask = mask;
例如,在此图像中,白色正方形不是叠加的正方形,它是一个孔,显示其后面窗口背景的白色:

编辑:我觉得有义务,因为我在评论中提到了这一点,展示如何使用CAShapeLayer做同样的事情。结果完全相同:

CGRect r = self.iv.bounds;
CGRect r2 = CGRectMake(20,20,40,40); // adjust this as desired!
CAShapeLayer* lay = [CAShapeLayer layer];
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, nil, r2);
CGPathAddRect(path, nil, r);
lay.path = path;
CGPathRelease(path);
lay.fillRule = kCAFillRuleEvenOdd;
self.iv.layer.mask = lay;

这里有一个简单的Swift函数
cut#hole#inView
用于2017年的复制和粘贴

func cut(hole: CGRect, inView v: UIView) {
    let p:CGMutablePath = CGMutablePath()
    p.addRect(inView.bounds)
    p.addRect(hole)

    let s = CAShapeLayer()
    s.path = p
    s.fillRule = kCAFillRuleEvenOdd

    v.layer.mask = s
}

只需要@Fattie的版本,再次感谢!以下是Swift 5.1的更新代码:

private func cut(holeRect: CGRect, inView view: UIView) {
    let combinedPath = CGMutablePath()
    combinedPath.addRect(view.bounds)
    combinedPath.addRect(holeRect)

    let maskShape = CAShapeLayer()
    maskShape.path = combinedPath
    maskShape.fillRule = .evenOdd

    view.layer.mask = maskShape
}

如果您希望剪切出具有圆角,可以将
combinedPath.addRect(Hol直立)
替换为
rectanglePath.addRoundedRect(in:Hol直立,cornerWidth:8,cornerHeight:8)

您希望在图像或显示它的UIImageView中剪切孔吗?看看我是如何在UIImageView中打孔的(及其形象)在这段代码中:除了画一个正方形而不是一个圆形之外,你会做完全相同的事情。@matt:在实际的UIImageView中切一个孔实际上是完美的!除了,我不知道如何使用你链接的代码:p什么是CLayer和CGContextRef?谢谢!!我很高兴你想知道这里到底发生了什么,而不仅仅是复制一堆盲目的代码。下面是我关于如何在iOS中绘制的完整解释,包括代码中涉及的所有内容,除了实际的“屏蔽层”部分:下面是我对层的讨论(你需要知道这一点,因为打孔涉及到屏蔽视图的层):(特别要看)@马特:我会仔细阅读的,非常感谢!大量有用的信息这非常有效,非常感谢马特!我仍然在阅读你链接的内容,但知道我有工作代码可供参考真是太棒了:D再次感谢,伙计,你太棒了!:)真正酷的部分(其中一个)是,这在任何UIView上都有效。你可以在任何东西上打洞。此外,您可以冲压半透明孔,而不是冲压纯孔。而且,我们在这里所做的并不是唯一的方法;我们可以用一个CAShapeLayer作为我们的面具,而不是制作一个图像。那/是/相当酷!!如果我需要再做类似的事情,我一定要记住这一点:我的答案是演示如何使用形状层。开始时,您可能会发现这更容易。另外(得到这个)一个形状层可以让你为它显示的形状设置动画,所以我认为你可以用动画的方式移动或改变这个洞。这太酷了!是的,这有点道理,但是在所有这些“点击”之前,我还有相当多的学习要做:再次感谢你,伙计D