2016-10-19 1 views
1

부모보기 센터에 UIImageView을 배치하려고합니다. 이미지는 원래 가로 세로 비율을 유지해야하며 부모의 경계를 초과해서는 안됩니다. 따라서 풍경 이미지는 부모의 너비에 따라 제한되어야하고 세로 이미지는 원래 비율을 유지하면서 필요한만큼 수직 공간을 차지해야합니다.AutoLayout : UIImageView 및 Aspect Fit 콘텐츠 모드

소리는 AutoLayout을위한 상당히 간단한 작업과 같습니다. 맞습니까? 여기 내 설치가 UIImageView위한거야 :

  • 센터 수직으로 부모의
  • 센터 수평으로 부모의
  • imageView.width < = superview.width
  • imageView.height < = superview.height

나는 또한 contentModeAspect Fit으로 설정합니다. 모든게 정말 장치 화면보다 작은 작은 이미지에 대한 작동하지만 내 UIImageView 큰 이미지에 대한 기본 UIImage (녹색 배경 - imageView.backgroundColor = [UIColor greenColor] 통지)보다 더 많은 공간을 차지합니다.

enter image description here

왜 이런 일이 무엇입니까? 나는 내 제약 조건에 맞는 AutoLayout 전문가가 아니다. 200x400과 같이 작은 이미지를 사용하면 UIImageView은 녹색 부분이없는 화면에서 정확히 200x400 지점을 차지합니다.

테두리와 둥근 모서리를 추가하고 싶습니다.이 경우 분명히 제대로 작동하지 않습니다.

답변

1

폭 및 높이 제한을 < =으로 설정했기 때문에 이러한 현상이 발생합니다. 작은 이미지의 경우 imageView의 프레임이 아무 문제없이 계산되며 모든 제약 조건이 충족됩니다. 그러나 큰 이미지가 설정되면 imageView의 크기가 설정되어 이미지가 맞지만 슈퍼 뷰 (화면 크기)의 크기에 따라 이미지의 크기가 제한됩니다.

  • 확실히 가로 세로 비율을 알고있는 경우 제약 조건으로 설정할 수 있으며 녹색 배경이 표시되지 않습니다.
  • 그렇지 않으면 단지 제약 조건을 그대로두고 배경색을 지워 색상을 설정하십시오. 이 비어있는 영역은 투명하게 표시되며 사용자가 설정 한 모든 이미지 은 적어도 하나의 차원에서 최대 공간을 차지합니다.

편집 :

아마 없을 최고의 솔루션, 가지 oldschool.당신은 엄격한 폭과 높이 제약 조건을 추가하고 수동으로 이미지의 aspectRatio 사용하여 계산할 수 있습니다

@IBOutlet weak var heightConstraint: NSLayoutConstraint! 
@IBOutlet weak var widthConstraint: NSLayoutConstraint! 

func setImage(image: UIImage) { 
    imageView.image = image 
    let screenSize = UIScreen.main.bounds.size 

    let imageAspectRatio = image.size.width/image.size.height 
    let screenAspectRatio = screenSize.width/screenSize.height 

    if imageAspectRatio > screenAspectRatio { 
     widthConstraint.constant = min(image.size.width, screenSize.width) 
     heightConstraint.constant = widthConstraint.constant/imageAspectRatio 
    } 
    else { 
     heightConstraint.constant = min(image.size.height, screenSize.height) 
     widthConstraint.constant = heightConstraint.constant * imageAspectRatio 
    } 
    view.layoutIfNeeded() 
} 
+0

불행히도이보기에서 다른 이미지를 표시해야하므로 불행히도 가로 세로 비율을 미리 알 수 없습니다 : 크고 작은 조경 세로 또는 정사각형. 스크린 샷의 이미지는 3264x2448 해상도이며 실제로 크기가 적절히 축소됩니다. 비율이 유지되고 잘리지 않거나 흐트러지지 않습니다. 그러나 불행히도 이미지보기에는 이미지 자체보다 많은 실제 공간이 필요합니다. 테스트 목적으로 녹색 배경이 추가되었습니다. 둥근 모서리를 추가해야하므로 투명한 배경이 작동하지 않지만 이미지 뷰의 가장자리가 이미지와 일치하지 않기 때문에 이러한 모서리가 보이지 않습니다. – fraggjkee

+0

하지만 프로그램 적으로 대응하는 Aspect Ratio 제약 조건을 추가 할 수 있다고 생각합니다. 계획과 같은 사운드 :) 실제로 AutoLayout을 사용하지 않고 프로그램으로 모든 것을 계산하고 설정할 수 있으므로이 질문의 아이디어는 달성 가능한지 여부를 이해하는 것이 었습니다 Swift/Objective-C 코드를 작성하지 않아도됩니다. – fraggjkee

+0

@fraggjkee : 좋습니다.하지만 계획이 실패하면 업데이트 된 답변에서 내 기능 만 사용하십시오. 크고 작은 인물 사진과 풍경 이미지로 테스트 해본 결과 예상대로 작동하는 것 같습니다. – alexburtnik

0

시도가 Clip to Bounds Image View

인터페이스 빌더에 이미지 뷰에 대해 "경계에 클립"을 확인하고 당신은 잘되어 있어야합니다 정의 된 높이와 너비 "< ="

관련 문제