UIImageView에서 코너 반경 설정이 작동하지 않습니다


129

나는 약간의 손실에 있습니다. UIView의 레이어 속성을 사용하여 앱에서 여러 요소의 모서리를 둥글게했습니다. 그러나이 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.
}

내가 놓친 셀이로드되는 방식에 대한 것이 있습니까?

답변:


377

레이어의 masksToBounds속성을 YES다음과 같이 설정해야 합니다 .

cell.previewImage.layer.masksToBounds = YES;

이는 UIImageView컨트롤이 UIImage객체 를 보유 할 의사 서브 뷰를 생성 하기 때문 입니다.


19
뷰를 래스터 화하지 않으면 (view.layer.shouldRasterize = YES) 모든 프레임에는 모든 픽셀의 마스크가 다시 필요합니다.
jjxtra

@jjxtra 그래서 설정하는 것이 좋습니다 shouldRasterize = false?
user924

shouldRasterize가 false이면 마스크 생성 오버 헤드를 매 프레임마다 지불합니다. shouldRasterize가 true이고 레이어가 매 프레임마다 변경되면 마스크 오버 헤드와 래스터 화 오버 헤드를 지불합니다. 이상적인 경우는 shouldRasterize = true 인 정적 (매우 자주 변경되지 않음) 레이어입니다.
jjxtra

30

또한 주목할 가치가 있습니다.

  1. clipsToBounds / masksToBounds와 함께 aspectFit AND cornerRadius를 사용 하는 경우 둥근 모서리를 얻지 못합니다.

즉 당신이 이것을 가지고 있다면

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위와 같다고 생각하십시오 .
Alfie Hanssen

4
@AlfieHanssen 레이어는 masksToBounds :, 뷰는 clipsToBounds :
Kevin

11

나는 당신이 설정해야한다고 생각합니다 :

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

4

Xcode Interface Builder에서 뷰의 'Clip Subviews'Drawing 속성을 선택하고 코드에서 모서리 반경을 설정하면 cell.previewImage.layer.cornerRadius = 20;나에게 도움이됩니다!

IB의 'Clip Subviews'옵션 참조



2

이 코드를 사용해보십시오 :-

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

코드 전용 답변은 권장하지 않습니다. 편집을 클릭하고 코드에서 질문을 처리하는 방법을 요약하는 단어를 추가하거나 이전 답변 / 답과 어떻게 다른지 설명하십시오. 감사합니다
Nick

1

들면 imageView.contentMode = .scaleAspectFill(가) cornerRadius화상이 매우 큰 경우에 적용되지 않고, 하드웨어에 따라.

크기가 조정 된 파노라마 이미지를 사용한 일부 테스트 :

  • 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

스위프트 4.2 답변 :

모서리 반경이 작동하려면 이미지를에 추가 UIView한 다음 이미지의 masksToBounds속성을 true다음 으로 설정해야 합니다 .

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

참고 : 20을 원하는대로 바꾸십시오. cornerRadius


0

이전 답변에서 아무것도 작동하지 않습니까?

UIImageView의 크기가 이미지 크기보다 클 수 있습니다. 코너 반경은 잘 설정 될 수 있지만이 경우에는 보이지 않습니다.

코드로 UIImageView 크기를 빠르게 확인 : 또는 XCode에서 "View UI 계층"도구를 사용할 수 있습니다.

self.imageView.backgroundColor = [UIColor greenColor]; 

이 시나리오에서는 UIImageView가 이미지와 동일한 종횡비를 갖도록해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.