如何隐藏UIView的子帧?

时间:2013-02-11 16:43:28

标签: iphone ios objective-c uiview

假设我有一个带框架的UIImageView(0,0,100,30) 。为imageView分配了一个图像。

最简单的方法是仅显示图像的一部分吗?

例如:仅出现在点30-60(宽度)和0-30(高度)中。这意味着应隐藏图像的左右边缘。

只是为了澄清,我不想移动视图也不想改变它的大小,我只是想隐藏它的框架的副本。

3 个答案:

答案 0 :(得分:3)

你总是可以设置一个面具。

CALayer *maskLayer = [CALayer layer];
maskLayer.backgroundColor = [UIColor blackColor].CGColor;
maskLayer.frame = CGRectmake(30.0, 0.0, 30.0, 30.0);

view.layer.mask = maskLayer;

蒙版可以是任何类型的图层,因此您甚至可以使用CAShapeLayer复杂蒙版,并做一些非常酷的东西。

答案 1 :(得分:1)

我发现此解决方案适用于我,https://stackoverflow.com/a/39917334/3192115

func mask(withRect rect: CGRect, inverse: Bool = false) {
    let path = UIBezierPath(rect: rect)
    let maskLayer = CAShapeLayer()

    if inverse {
        path.append(UIBezierPath(rect: self.view.bounds))
        maskLayer.fillRule = kCAFillRuleEvenOdd
    }

    maskLayer.path = path.cgPath
    imageView?.layer.mask = maskLayer
}

答案 2 :(得分:0)

我相信屏蔽图像是最好的选择。但是如果你要旋转,变换,动画或想要一个清晰的背景,你可以做这样的事情:

创建一个子视图,该视图是您要显示的图像的大小。确保其clipsToBounds为真,并相应地定位图像。

UIView *mainView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 30)];

//this is the part of the image you wish to see
UIView *imageWindow = [[UIView alloc] initWithFrame:CGRectMake(30, 0, 30, 30)];
imageWindow.clipsToBounds = YES;

//your image view is the height and width of mainView and x and y is imageWindow - mainView. You can do this manually or put in calculations.
UIImageView *myImage = [[UIImageView alloc] initWithFrame:CGRectMake(imageWindow.frame.origin.x - mainView.frame.origin.x, imageWindow.frame.origin.y - mainView.frame.origin.y, mainView.frame.size.width, mainView.frame.size.height)];
myImage.image = [UIImage imageNamed:@"1024x1024.png"];

[imageWindow addSubview:myImage];
[mainView addSubview:imageWindow];
[self.view addSubview:mainView];

查看我的代码,我认为mainView不是必需的,您可以直接将imageWindow添加到self.view。