UIViewContentModeScaleAspectFill이 클리핑되지 않음


144

를 사용하여 고정 크기 (100x100)로 일부 축소판 이미지를 그리려고합니다 UIImageView. 이미지 뷰의 프레임 크기를 100x100으로 설정하고 contentMode로 설정 했습니다 UIViewContentModeScaleAspectFill.

내 이해는 이것이 내가 설정 한 크기로 이미지를 그려야하며 이미지가 이미지 영역을 채우고 이미지보기에 설정 한 크기를 벗어난 이미지 부분을 자릅니다. 그러나 이미지는 여전히 내가 설정 한 100x100 크기보다 크거나 작게 그려집니다.

내가 설정 한 경우 contentMode합니다 UIviewContentModeScaleToFill, 다음 이미지는 정확히 100 × 100에서 그려되지만 그 크기에 맞게 왜곡입니다. 화면비가 예상대로 클리핑되지 않는 이유가 있습니까?

내 코드는 다음과 같습니다.

_photoView = [[UIImageView alloc] initWithImage:photoImage];
_photoView.contentMode = UIViewContentModeScaleAspectFill;
[self addSubview:_photoView];

CGRect photoFrame = _photoView.frame;
photoFrame.size = CGSizeMake(100, 100);
_photoView.frame = photoFrame;

더 잘 설명하기 위해, 내가보고있는 것의 스크린 샷이 있습니다. 녹색 사각형은 내가 작업하고 UIView있는 UIImageView것을 포함합니다 . 배경색을 녹색으로, 뷰 프레임을 100x100으로 설정했습니다. 테스트 UIImageViews로 크기는 50x50입니다. 보시다시피,를 사용할 때 ...AspectFill이미지의 크기가 50x50으로 조정되지 않고 경우에 따라 원하는 위치에서 오프셋됩니다. 를 사용하면 ...ScaleToFill크기가 올바르게 설정되지만 이미지가 왜곡됩니다.

문제를 설명하는 스크린 샷

답변:


352

클립을 경계로 설정해 볼 수 있습니까

[_photoview setClipsToBounds:YES];

또는 가능한 경우 스토리 보드 / Xib에서 직접 :

여기에 이미지 설명을 입력하십시오


10
그게 다야-고마워 (위의 스크린 샷을 추가하여 다른 사람이이 문제를
겪는

3
인터페이스 빌더에서 "클립 파단"을 (unhelpfully) 이름 (주의 :이 경우, "파단"CLIB하지 않는 이름이 잘못되었습니다 : 그것은 클립 자신과 파단)
아담

3
NIB 파일에서 'Clip Subviews'옵션을 선택하면 동일한 작업이 수행됩니다. 건배.
codeburn

하지만 :(의 CALayer 속성을 사용하여 그 뒤에 다른보기를 추가 그림자를 추가 할 경우에 대한 어떤 것은 나에게 적합하지 않습니다
Rambatino

나처럼 자동 레이아웃을 사용하는 경우 NSLayoutConstraint "UIView-Encapsulated-Layout-Height"가 UIImageView 크기 제한을 위반하는 또 다른 원인이있을 수 있습니다.
ewiinnnnn

8

지식을 넓히고 싶다면 iOS UIView 스택이 어떻게 렌더링 되는지에 대한 좋은 기사 있습니다. 전체 도면 파이프 라인 에 대한보다 자세한 기사도 있습니다.

요약해서 말하자면:

  1. 래스터 화 -모든 뷰의 컨텐츠는 뷰 경계의 좌표 공간에서 래스터 화 (그리기 또는 오프 스크린 픽셀 버퍼)됩니다. 이미지 데이터 또는 사용자 정의 도면 (예 drawRect::)이지만 서브 뷰 컨텐츠 일 수 있습니다. 이 래스터 화는 contentMode속성 을 고려합니다 .

    뷰의 경계를 벗어나는 것은 버려집니다.

  2. 구성 -결과가 서브 뷰에서 수퍼 뷰로 합성됩니다 (서로 위에 그려 짐). 이것은 서브 뷰의 프레임 속성을 사용합니다.

    clipsToBounds속성이 YES수퍼 뷰에 있으면 하위 범위 내용을 경계 외부에서 버립니다 .


2

같은 문제가 있었고 "Clip Subviews"를 선택하여 해결되었습니다.

스토리 보드 미리보기에서는 시뮬레이터가 아닌 모든보기 (3.5,4,4.7,5.5, ipad)에 대해 이미지가 올바르게 표시되었습니다.

"Clip Subviews"를 체크하면 문제가 해결되었습니다. :)


1

Storyboard / Xib에서 직접 "클립 하위 뷰"를 확인하면 나에게 도움이되었습니다. 여기에 이미지 설명을 입력하십시오


0

내 하위 뷰의 크기가 조정되었으며 xib에 자동 레이아웃이 설정되어 있기 때문에 깨달았습니다. 여기에 이미지 설명을 입력하십시오


0

모든 것이 실패하면

viewDidLayoutSubviews 메서드에서 클립을 경계로 만듭니다.

예 :

  override func viewDidLayoutSubviews() {

    imageProfile.layer.cornerRadius = imageProfile.bounds.size.width/2
    imageProfile.clipsToBounds = true
    imageProfile.layer.masksToBounds = true
 }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.