Đặt Corner Radius trên UIImageView không hoạt động


129

Tôi có một chút mất mát. Tôi đã sử dụng thuộc tính lớp của UIView để làm tròn các góc của nhiều thành phần trong ứng dụng của mình. Tuy nhiên, một UIImageView này chỉ đơn giản là không tuân thủ. Không chắc chắn những gì tôi đang thiếu.

UIImageView (được gọi là previewImage) được chứa trong Ô xem bảng. Tôi đã thử đặt nhiều thuộc tính angleRadius (trong chính ô và trong bộ điều khiển tạo ô) nhưng không có kết quả.

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.
}

Có điều gì đó về cách các tế bào được tải mà tôi đang thiếu?

Câu trả lời:


377

Bạn cần đặt thuộc tính của lớp masksToBoundsthành YES:

cell.previewImage.layer.masksToBounds = YES;

Điều này là do UIImageViewđiều khiển tạo ra một khung nhìn giả để giữ UIImageđối tượng.


19
Trừ khi bạn cũng rasterize view (view.layer.shouldRasterize = YES), mọi khung hình sẽ yêu cầu mặt nạ lại của tất cả các pixel.
jjxtra

@jjxtra vậy tốt hơn nên đặt shouldRasterize = false?
user924

Nếu ShouldRasterize là sai, bạn phải trả phí cho việc tạo mặt nạ trên mọi khung hình. Nếu ShouldRasterize là đúng và lớp của bạn thay đổi mọi khung hình, bạn phải trả chi phí mặt nạ và chi phí rasterization. Trường hợp lý tưởng là một lớp tĩnh (không thay đổi rất thường xuyên) với ShouldRasterize = true.
jjxtra

30

Cũng đáng lưu ý rằng

  1. Nếu bạn đang sử dụng facFit AND angleRadius với clipToBound / maskToBound, bạn sẽ không nhận được các góc tròn.

tức là nếu bạn có cái này

theImageView.contentMode = .scaleAspectFit

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

hoặc là

theImageView.layer.masksToBounds = true

sẽ không hoạt động . bạn sẽ phải thoát khỏi mã facFit

//theImageView.contentMode = .scaleAspectFit
  1. Đảm bảo chiều rộng và chiều cao của Chế độ xem hình ảnh giống nhau

Tóm lại: đặt tỷ lệ khung hình 1: 1 nếu bạn muốn sử dụng AspectFit
djdance 11/03/19

22

Điều này sẽ làm việc

cell.previewImage.clipsToBounds = YES;

cell.previewImage.layer.cornerRadius = 20;

3
Không chắc chắn clipsToBoundslà một phương thức trên lớp sau này. Hãy tin masksToBoundsnhư trên.
Alfie Hanssen

4
Các lớp @AlfieHanssen có mặt nạToBound:, lượt xem có clipToBound:
Kevin

11

Tôi tin rằng bạn cần phải thiết lập:

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

4

Trong Trình tạo giao diện Xcode, chọn thuộc tính Vẽ 'Clip Subview' cho chế độ xem cùng với việc đặt bán kính góc trong mã cell.previewImage.layer.cornerRadius = 20;thực hiện công việc cho tôi!

Xem tùy chọn 'Clip Subview' trong IB


2

Hãy thử đoạn mã dưới đây

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

2

Hãy thử mã này: -

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

Câu trả lời chỉ có mã được khuyến khích. Vui lòng nhấp vào chỉnh sửa và thêm một số từ tóm tắt cách mã của bạn giải quyết câu hỏi hoặc có thể giải thích câu trả lời của bạn khác với câu trả lời / câu trả lời trước đó như thế nào. Cảm ơn
Nick

1

Đối với imageView.contentMode = .scaleAspectFillcáccornerRadius không áp dụng nếu hình ảnh là rất lớn, tùy thuộc vào phần cứng.

Một số thử nghiệm với hình ảnh toàn cảnh đã thay đổi kích thước:

  • iPhone X, kích thước hình ảnh 5000x1107: 🚫 4000x886:
  • iPhone 6s Plus, kích thước hình ảnh 10000x2215: 5000x1107:
  • iPhone 6s, kích thước hình ảnh 10000x2215: 🚫 5000x1107:

Kích thước imageView trong đó 160x100. Thật thú vị, phần cứng mới hơn không nhất thiết phải có khả năng hơn.

Hãy chỉnh sửa bài đăng này với kết quả kiểm tra nhiều hơn!


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 Trả lời:

Để bán kính góc hoạt động, hãy thêm hình ảnh vào a UIViewvà sau đó bạn cần đặt thuộc tính của hình ảnh masksToBoundsthành true:

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

Lưu ý: Thay thế 20 bằng mong muốn cornerRadius


0

Không có gì từ các câu trả lời trước đang làm việc?

Có thể xảy ra rằng kích thước của UIImageView lớn hơn kích thước hình ảnh. Bán kính góc có thể được đặt tốt nhưng không thể nhìn thấy trong trường hợp đó.

Kiểm tra nhanh kích thước UIImageView theo mã: (hoặc có thể sử dụng công cụ "Xem phân cấp giao diện người dùng" trong XCode)

self.imageView.backgroundColor = [UIColor greenColor]; 

Trong kịch bản này, bạn nên đảm bảo rằng UIImageView có tỷ lệ khung hình giống như hình ảnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.