我们可以使用UIImageView
在图像上设置以下形状。
任何想法!
由于
答案 0 :(得分:14)
像其他人建议的那样,我会使用图片的mask
属性。
Apple关于mask
属性的信息:
图层的Alpha通道决定了图层内容和背景的显示量。完全或部分不透明的像素允许底层内容显示但完全透明的像素阻止该内容。 此属性的默认值为nil nil。
配置遮罩时,请记住设置遮罩层的大小和位置,以确保遮罩层与遮罩层正确对齐。
最后一句很重要!
我使用Sketch创建了一个带有透明背景的黑色图像(PNG)。
将其添加到Assets.xcassets文件夹中。我的图片名为profileMask
。
为图像视图创建一个插座。我打电话给我profileImageView
。
override func viewDidLoad() {
super.viewDidLoad()
let maskImageView = UIImageView()
maskImageView.contentMode = .scaleAspectFit
maskImageView.image = #imageLiteral(resourceName: "profileMask")
maskImageView.frame = profileImageView.bounds
profileImageView.mask = maskImageView
}
注意:
所以我有了这个想法,“如果我只使用蒙版图像作为边框怎么办?”有效!这样做的好处是你可以在将来使用任何面具形状,它将为它创建一个边框,而不必弄清楚bezier路径。
我是这样做的:
profileImageView
设置为蒙版,并将色调颜色更改为我想要的边框。profileImageView
减去2个点相同的大小(以显示将成为边框的基础蒙版图像)。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)
}
现在,当我们运行它时,它看起来像这样:
如果我们使用蒙版和边框宽度属性创建自定义UIImageView,那真可能真的很酷。然后你可以只分配这些属性,自定义类将处理其余的。让我知道,如果你们想看到这样的东西,我会创建它并在这里发布。也许还可以为我的频道制作YouTube视频教程。
答案 1 :(得分:5)
您可以使用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掩码:
- (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;
}
答案 2 :(得分:5)
是的,您可以在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];
}
答案 3 :(得分:1)
抱歉硬编码。尝试使用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;
答案 4 :(得分:1)
使用
很容易UIImageView *image=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"balloon_selected_left.png"] ];
self.maskImage.layer.mask=image.layer;