uiimageview特定的形状图像

UIImageView可以在图像上设置下面的形状吗?

任何想法!

谢谢

在这里输入图像说明

是的,你可以在UIImage上设置一个形状。 首先,在你的项目中添加一个Mask图像(你想要的形状)。 并编写这些代码。

 [yourImageView setImage:[self createMaskImage:yourImage withMask:MaskImage]]; - (UIImage*) createMaskImage:(UIImage *)image withMask:(UIImage *)maskImage { CGImageRef maskRef = maskImage.CGImage; CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); CGImageRef masked = CGImageCreateWithMask([image CGImage], mask); return [UIImage imageWithCGImage:masked]; } 

Swift 3版本 – 带边框

像其他人一样,我会使用图像的mask属性。

来自苹果公司关于mask属性的信息:

图层的Alpha通道决定了图层的内容和背景的显示。 完全或部分不透明的像素允许底层内容显示,但完全透明的像素屏蔽该内容。 这个属性的默认值是零零。

configuration遮罩时,请记得设置遮罩层的大小和位置,以确保遮罩层与遮罩层正确alignment。

最后一句话很重要!

1.创build你的面具

我使用Sketch来创build一个带有透明背景(PNG)的黑色图像。

将其添加到您的Assets.xcassets文件夹。 我的图像被称为profileMask

面具图像

2.将UIImageView添加到Storyboard

为图像视图创build一个出口。 我打电话给我的profileImageView

故事板

3.代码viewDidLoad

 override func viewDidLoad() { super.viewDidLoad() let maskImageView = UIImageView() maskImageView.contentMode = .scaleAspectFit maskImageView.image = #imageLiteral(resourceName: "profileMask") maskImageView.frame = profileImageView.bounds profileImageView.mask = maskImageView } 

注意:

  • 我添加了contentMode,因为没有它,我的mask被拉伸以匹配UIImageView的边界(宽度)。 你可以通过使你的UIImageView的大小与你的蒙板相同来解决这个问题,反之亦然。

这是运行时的样子: 在模拟器中

边界怎么样?

伙计们,这是一个痛苦的事情。 我试图创造一个贝塞尔path,但说实话,我的技能,做一个确切的形状,以配合面具是不可能的。 如果你有这样的技能,贝塞尔path可能看起来非常好,但是我不知道。 🙁

所以我有这样的想法,“如果我只是使用蒙版图像作为边界呢? 有效! 这样做的好处是你可以使用任何面具的形状在未来,它将创build一个边界,而不必找出贝塞尔path。

以下是我如何做到的:

  1. 在Assets.xcassets中,select您的蒙版并将此“ 渲染为”属性更改为“模板图像”。 这使您可以通过更改UIImageView的Tint Color属性来更改蒙版图像的颜色 模板图像
  2. 然后在代码中,我将profileImageView设置为蒙版,并将色彩颜色更改为任何我想要的边框。
  3. 然后,我为Jason的个人资料图片创build了另一个图像视图,并将其应用于其中。 我使它与profileImageView减去2点相同的大小(显示底层掩码图像将是边框)。
  4. 最后一步是他们添加被掩盖的图像作为profileImageView的子视图。

以下是viewDidLoad中的代码:

 override func viewDidLoad() { super.viewDidLoad() // Add border first (mask image) profileImageView.contentMode = .scaleAspectFit profileImageView.tintColor = .lightGray // Border Color profileImageView.image = #imageLiteral(resourceName: "profileMask") // Profile Image let profileImage = UIImageView() profileImage.image = #imageLiteral(resourceName: "Profile") profileImage.contentMode = .scaleAspectFill // Make a little bit smaller to show "border" image behind it profileImage.frame = profileImageView.bounds.insetBy(dx: 2, dy: 2) // Mask Image let maskImageView = UIImageView() maskImageView.image = #imageLiteral(resourceName: "profileMask") maskImageView.contentMode = .scaleAspectFit maskImageView.frame = profileImage.bounds // Apply mask to profile iamge profileImage.mask = maskImageView // Add profile image as a subview on top of the "border" image profileImageView.addSubview(profileImage) } 

所以现在看起来像这样,当我们运行它:

与边界

闭幕

如果我们用掩码和边框宽度属性创build一个自定义的UIImageView,那真的很酷。 然后,你可以只分配这些属性,自定义类将照顾其余的。 让我知道,如果你们想看到这样的事情,我会创build它,并在这里发布。 也许还可以为我的频道制作YouTubevideo教程。

你可以使用imageView的CALayer的mask属性:

 CALayer *mask = [CALayer layer]; mask.contents = (id)[[UIImage imageNamed:@"mask.png"] CGImage]; mask.frame = CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height); imageView.layer.mask = mask; imageView.layer.masksToBounds = YES; 

这只适用于ImageView,所以如果你想直接改变UIImage – 你应该使用Core Graphics mask:

 - (UIImage*) maskImage:(UIImage *)image withMask:(UIImage *)maskImage { CGImageRef maskRef = maskImage.CGImage; CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), CGImageGetHeight(maskRef), CGImageGetBitsPerComponent(maskRef), CGImageGetBitsPerPixel(maskRef), CGImageGetBytesPerRow(maskRef), CGImageGetDataProvider(maskRef), NULL, false); CGImageRef maskedImageRef = CGImageCreateWithMask([image CGImage], mask); UIImage *maskedImage = [UIImage imageWithCGImage:maskedImageRef]; CGImageRelease(mask); CGImageRelease(maskedImageRef); // returns new image with mask applied return maskedImage; } 

对不起,硬编码。 尝试使用UIBezierPath来设置你想要的任何形状。

 CAShapeLayer* maskLayer = [CAShapeLayer layer]; UIBezierPath* path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(75, 200)]; [path addCurveToPoint:CGPointMake(0, 100) controlPoint1:CGPointMake(0, 150) controlPoint2:CGPointMake(0, 150)]; [path addArcWithCenter:CGPointMake(75, 100) radius:75 startAngle:M_PI endAngle:0 clockwise:YES]; [path addCurveToPoint:CGPointMake(75, 200) controlPoint1:CGPointMake(150, 150) controlPoint2:CGPointMake(150, 150)]; [path closePath]; maskLayer.backgroundColor = [[UIColor clearColor] CGColor]; maskLayer.path = [path CGPath]; yourImageView.layer.mask = maskLayer; 

这很容易使用

 UIImageView *image=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"balloon_selected_left.png"] ]; self.maskImage.layer.mask=image.layer;