在自动布局和大小类中屏蔽图像
Mask an image in autoLayout and sizeclass
我正在尝试在 iOS 8 xcode 7.3 自动布局大小 class 模式下屏蔽图像(在 table 视图单元格中)。
我看了这个link:How to Mask an UIImageView
第一个答案不适合我。第二个答案有效,但蒙版图像的大小不正确。我的代码是:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
UIImage *imgStory = [UIImage imageNamed:@"story1"];
UIImage *imgMask = [UIImage imageNamed:@"storyFrameMask"];
UIImageView *imgViewStory = (UIImageView *)[cell viewWithTag:100];
UIImageView *imgViewBorder = (UIImageView *)[cell viewWithTag:101];
imgViewStory.image = imgStory;
CALayer *mask = [CALayer layer];
mask.contents = (id)[[UIImage imageNamed:@"storyFrameMask"] CGImage];
// mask.frame = CGRectMake(imgViewBorder.frame.origin.x, imgViewBorder.frame.origin.y, 178.0, 235.0);
mask.frame = CGRectMake(imgViewBorder.frame.origin.x, imgViewBorder.frame.origin.y, imgViewBorder.frame.size.width, imgViewBorder.frame.size.height);
imgViewStory.layer.mask = mask;
imgViewStory.layer.masksToBounds = YES;
}
我的输出屏幕截图是:
[![在此处输入图片描述][1]][1]
我可以通过为遮罩框的宽度和高度指定自定义值来解决这个问题(我在我的代码中注释了固定宽度和高度。你可以看到它。),你知道这不是正确的方法.因为我使用的是自动布局和大小 class.
固定宽度和高度仅适用于单一尺寸 class。
这是我设置固定宽度和高度时的屏幕截图:
[![在此处输入图片描述][2]][2]
我搜索了所有网站,但没有一个是自动布局的。
任何人都可以帮助我为所有尺寸 classes 和设备制作一个好的面罩。
编辑:请注意,我的蒙版图像视图的约束与边框图像视图相同。所以他们的框架彼此相等。所以问题不是出在我的布局上。问题是淹没在蒙版图像视图上的蒙版图像。我可以通过为蒙版框架的宽度和高度提供自定义值来解决问题,但这不是自动布局的正确方法。
已编辑:旧答案不正确。
问题出在-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
,图像视图的帧不是最终帧。那一刻它的框架等于故事板中的设计尺寸。
要解决此问题,我认为您应该在自定义单元格中覆盖 - (void)layoutSubviews
,并像这样设置正确的蒙版框架:
- (void)layoutSubviews {
[super layoutSubviews];
CALayer *mask = [CALayer layer];
mask.contents = (id)[[UIImage imageNamed:@"storyFrameMask"] CGImage];
// mask.frame = CGRectMake(imgViewBorder.frame.origin.x, imgViewBorder.frame.origin.y, 178.0, 235.0);
mask.frame = CGRectMake(imgViewBorder.frame.origin.x, imgViewBorder.frame.origin.y, imgViewBorder.frame.size.width, imgViewBorder.frame.size.height);
imgViewStory.layer.mask = mask;
imgViewStory.layer.masksToBounds = YES;
}
我正在尝试在 iOS 8 xcode 7.3 自动布局大小 class 模式下屏蔽图像(在 table 视图单元格中)。
我看了这个link:How to Mask an UIImageView
第一个答案不适合我。第二个答案有效,但蒙版图像的大小不正确。我的代码是:
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
UIImage *imgStory = [UIImage imageNamed:@"story1"];
UIImage *imgMask = [UIImage imageNamed:@"storyFrameMask"];
UIImageView *imgViewStory = (UIImageView *)[cell viewWithTag:100];
UIImageView *imgViewBorder = (UIImageView *)[cell viewWithTag:101];
imgViewStory.image = imgStory;
CALayer *mask = [CALayer layer];
mask.contents = (id)[[UIImage imageNamed:@"storyFrameMask"] CGImage];
// mask.frame = CGRectMake(imgViewBorder.frame.origin.x, imgViewBorder.frame.origin.y, 178.0, 235.0);
mask.frame = CGRectMake(imgViewBorder.frame.origin.x, imgViewBorder.frame.origin.y, imgViewBorder.frame.size.width, imgViewBorder.frame.size.height);
imgViewStory.layer.mask = mask;
imgViewStory.layer.masksToBounds = YES;
}
我的输出屏幕截图是: [![在此处输入图片描述][1]][1]
我可以通过为遮罩框的宽度和高度指定自定义值来解决这个问题(我在我的代码中注释了固定宽度和高度。你可以看到它。),你知道这不是正确的方法.因为我使用的是自动布局和大小 class.
固定宽度和高度仅适用于单一尺寸 class。
这是我设置固定宽度和高度时的屏幕截图: [![在此处输入图片描述][2]][2]
我搜索了所有网站,但没有一个是自动布局的。 任何人都可以帮助我为所有尺寸 classes 和设备制作一个好的面罩。
编辑:请注意,我的蒙版图像视图的约束与边框图像视图相同。所以他们的框架彼此相等。所以问题不是出在我的布局上。问题是淹没在蒙版图像视图上的蒙版图像。我可以通过为蒙版框架的宽度和高度提供自定义值来解决问题,但这不是自动布局的正确方法。
已编辑:旧答案不正确。
问题出在-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
,图像视图的帧不是最终帧。那一刻它的框架等于故事板中的设计尺寸。
要解决此问题,我认为您应该在自定义单元格中覆盖 - (void)layoutSubviews
,并像这样设置正确的蒙版框架:
- (void)layoutSubviews {
[super layoutSubviews];
CALayer *mask = [CALayer layer];
mask.contents = (id)[[UIImage imageNamed:@"storyFrameMask"] CGImage];
// mask.frame = CGRectMake(imgViewBorder.frame.origin.x, imgViewBorder.frame.origin.y, 178.0, 235.0);
mask.frame = CGRectMake(imgViewBorder.frame.origin.x, imgViewBorder.frame.origin.y, imgViewBorder.frame.size.width, imgViewBorder.frame.size.height);
imgViewStory.layer.mask = mask;
imgViewStory.layer.masksToBounds = YES;
}