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