在autoLayout和sizeclass

时间:2016-05-01 12:43:47

标签: ios objective-c autolayout mask

我试图在autoLayout大小类模式下屏蔽iOS 8 xcode 7.3中的图像(即在表视图单元格中)。

我看了这个链接: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]

我可以通过为蒙版框架的宽度和高度提供自定义值来解决问题(我在代码中注释了固定的宽度和高度。你可以看到它。),你知道这不是正确的方法。因为我使用的是自动布局和尺寸等级。

固定宽度和高度仅适用于单个尺寸类别。

这是我设定固定宽度和高度时的scren镜头: [![在此处输入图像说明] [2]] [2]

我搜索了所有网站,但没有一个用于自动布局。 任何人都可以帮助我为所有大小的类和设备配备一个好的掩码。

编辑:请注意,我的蒙面图像视图的约束与边框图像视图相同。所以他们的框架彼此相等。所以问题不在于我的布局。问题是被遮罩的图像视图上被淹没的蒙面图像。我可以通过为蒙版框架的宽度和高度提供自定义值来解决问题,但这不是自动布局中的正确方法。

1 个答案:

答案 0 :(得分:0)

编辑:旧答案不正确。

问题出在-(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;
}