在UIImageView上设置转角半径不起作用


129

我有点茫然。我已经使用UIView的layer属性来处理我的应用程序中多个元素的角落。但是,这个UIImageView根本不符合要求。不知道我在想什么。

UIImageView(称为PreviewImage)包含在表视图单元格中。我尝试将cornerRadius属性的多个位置(在单元格本身以及在创建该单元格的控制器中)设置为无效。

static NSString *CellIdentifier = @"MyTableViewCell";

MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:CellIdentifier owner:self options:nil];
    cell = [topLevelObjects objectAtIndex:0];
    cell.previewImage.layer.cornerRadius = 20; //Made it 20 to make sure it's obvious.
}

关于我丢失的单元格加载方式,有什么问题吗?

Answers:


376

您需要将图层的masksToBounds属性设置为YES

cell.previewImage.layer.masksToBounds = YES;

这是因为UIImageView控件创建了一个伪子视图来保存UIImage对象。


19
除非您还对视图进行栅格化(view.layer.shouldRasterize = YES),否则每一帧都将需要重新屏蔽所有像素。
jjxtra 2013年

@jjxtra,所以最好设置shouldRasterize = false
user924

如果shouldRasterize为false,则每帧都要支付掩码创建开销。如果shouldRasterize为true,并且图层每隔一帧更改一次,则您将支付蒙版开销和栅格化开销。理想的情况是具有shouldRasterize = true的静态(不经常更改)层。
jjxtra

29

还值得注意的是

  1. 如果您将AspectFit cornerRadius与clipsToBounds / masksToBounds一起使用,则不会得到圆角。

即如果你有这个

theImageView.contentMode = .scaleAspectFit

   theImageView.layer.cornerRadius = (theImageView.frame.size.height)/2
    theImageView.clipsToBounds = true

要么

theImageView.layer.masksToBounds = true

没用。您将必须摆脱AspectFit代码

//theImageView.contentMode = .scaleAspectFit
  1. 确保图像视图宽度和高度相同

简而言之:如果您想使用AspectFit,请将宽高比设置为1:1
djdance,

22

这应该工作

cell.previewImage.clipsToBounds = YES;

cell.previewImage.layer.cornerRadius = 20;

3
不确定clipsToBounds稍后的类中的方法。相信它masksToBounds如上。
阿尔菲·汉森

4
@AlfieHanssen图层具有masksToBounds :,视图具有clipsToBounds:
凯文

11

我相信您需要设置:

cell.previewImage.layer.masksToBounds = YES;
cell.previewImage.layer.opaque = NO;


2

在下面的代码中尝试一下

cell.previewImage.layer.cornerRadius = 20;
cell.previewImage.clipsToBounds = YES;

2

试试这个代码:

self.imgaviewName.clipsToBounds = true
self.imageviewName.layer.cornerRadius = 10

不鼓励仅使用代码的答案。请单击“ 编辑”,然后添加一些单词,以概括您的代码如何解决该问题,或者说明您的答案与以前的答案有何不同。谢谢
尼克

1

对于imageView.contentMode = .scaleAspectFillcornerRadius如果图像很大,则不应用,具体取决于硬件。

调整后的全景图像的一些测试:

  • iPhone X,图像尺寸5000x1107:🚫4000x886:✅
  • iPhone 6s Plus,图像尺寸10000x2215:🚫5000x1107:✅
  • iPhone 6s,图像尺寸10000x2215:🚫5000x1107:✅

imageView尺寸为160x100。有趣的是,较新的硬件不一定具有更强大的功能。

随意编辑此帖子,获得更多测试结果!


0
-(void) viewDidAppear:(BOOL)animated{
       [super viewDidAppear:animated];
       [self setMaskTo:viewDistance 
             byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight];
           }

- (void)setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners
     {
      UIBezierPath *rounded = [UIBezierPath 
                bezierPathWithRoundedRect:view.bounds
                                              byRoundingCorners:corners

                     cornerRadii:CGSizeMake(20.0, 20.0)];

          CAShapeLayer *shape = [[CAShapeLayer alloc] init];
          shape.frame = self.view.bounds;
         [shape setPath:rounded.CGPath];
          view.layer.mask = shape;
       }

0

Swift 4.2答案:

为了使拐角半径起作用,请将图像添加到中UIView,然后需要将图像的masksToBounds属性设置为true

planeImage.layer.masksToBounds = true
planeImage.layer.cornerRadius = 20

注意:将20替换为所需的 cornerRadius


0

先前的答案没有任何作用吗?

UIImageView的大小可能大于图像的大小。角半径可以设置得很好,但在这种情况下不可见。

通过代码快速检查UIImageView大小:(或可以使用XCode中的“ View UI Hierarchy”工具)

self.imageView.backgroundColor = [UIColor greenColor]; 

在这种情况下,您应确保UIImageView具有与图像相同的纵横比。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.