【问题标题】:How to hide a subframe of a UIView?如何隐藏 UIView 的子框架?
【发布时间】:2013-01-26 19:44:05
【问题描述】:

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

只显示部分图像的最简单方法是什么?

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

澄清一下,我不想移动视图也不想改变它的大小,我只想隐藏它的框架的一个子矩形。

【问题讨论】:

    标签: iphone ios objective-c uiview


    【解决方案1】:

    你总是可以设置一个掩码。

    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 用于复杂的蒙版并做一些非常酷的事情。

    【讨论】:

    • 在“CALayer *”类型的对象上找不到属性 fillColor。我错过了导入吗?
    • 因此,将背景颜色设置为 CGColor(不是 fillColor)就可以了。 @Ryan Poolos,编辑你的答案,我会接受。
    • 哦,对不起。 fillColorCAShapeLayer 的一个属性,我通常使用形状图层作为我的面具。习惯的生物。 :p
    • 我试过 CALayer,但对我不起作用。所以我尝试了 CAShaperLayer,它可以工作。
    【解决方案2】:

    我发现这个解决方案对我有用,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
    }
    

    【讨论】:

      【解决方案3】:

      我相信屏蔽图像是最好的选择。但是,如果您要旋转、变换、动画或想要清晰的背景,您可以执行以下操作:

      创建一个子视图,它是您要显示的图像的大小。确保将 clipsToBounds 设置为 true 并相应地定位图像。

      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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-30
        • 2013-02-10
        • 2018-08-11
        • 1970-01-01
        • 1970-01-01
        • 2012-07-21
        • 2017-07-06
        相关资源
        最近更新 更多