2015-01-03 5 views
12

스토리 보드를 사용하여 사용자 지정 UIView를 추가 할 때 UIView의 올바른 프레임 크기는 언제 계산됩니까? 에서 정확한 프레임 크기를 얻을 수 없습니다. UIView의init(frame: CGRect) 또는 init(coder aDecoder: NSCoder) 또는 awakeFromNib()입니다. override func layoutSubviews()에서 올바른 크기를 얻지 만 이번에는보기 컨트롤러보기에 추가되지 않습니다.해당 하위 클래스의 사용자 지정 UIView 프레임 크기를 얻는 곳

편집 : 나는 내 사용자 지정 UIViewCAGradientLayer 층 (내보기와 같은 크기를 가지고있는)를 추가하기 때문에 UIView의 서브 클래스에서이 작업을 수행 할
. UIViewControllerviewDidLayoutSubviews 방법으로보기를 설정하는 것보다 더 좋은 방법이 있어야합니다.

내 사용자 지정보기의 너비를 조정하는 두 가지 수직 제약 조건 (수퍼 뷰의 후행 및 선행 공간)이 있습니다. 그러나 너비는 화면 폭이 아니라 언급 된 방법에서 600입니다.

+0

'나는 오버라이드 func layoutSubviews()에서 정확한 크기를 얻었지만, 이번에는 뷰 컨트롤러의 뷰에 뷰가 추가되지 않습니다 .' 왜? – akashivskyy

+0

나는 잘 모른다. 질문은 이것에 관한 것입니다 : 그것은 나타나지 않습니다. – osrl

답변

21
func viewWillAppear(_ animated: Bool) 

뷰 계층 구조가 배치되고 기하학이 설정된 후에 viewController에서 호출됩니다.

보통 지오메트리 종속적 인 viewController 코드를 정렬하는 가장 좋은 장소이며, 전환 애니메이션이 실행되기 직전에 호출됩니다.

전환 애니메이션이 완료된 후에 호출되는 viewDidAppear이 호출됩니다.

재정의 할 수있는 적절한 UIView의 기능이 layoutSubviews이다 (오히려의 ViewController에 비해) 사용자 지정보기에서 직접이 설정을 원하는대로

업데이트합니다. 재정의에서 super.layoutSubviews()으로 전화하십시오. collectionView 세포 컬렉션보기 셀 collectionview의 레이아웃에서 자신의 프레임 데이터를 얻을 다음의 ViewController의 viewWillAppear 2 업데이트를

viewDidAppear 전에이 후

override func layoutSubviews() { super.layoutSubviews() //self.frame will be correct here } 

가 호출된다. 셀이 기하 알고해야하는 경우, 기본 layoutAttributes의 applyLayoutAttributes

func applyLayoutAttributes(_ layoutAttributes: UICollectionViewLayoutAttributes!) 

하나는 프레임 속성입니다 재정의 할 수 있습니다.collectionView.layout에서 직접 프레임을 추출하는 방법에 대한 아래 내 의견을 참조하십시오.

+1

'UIView 하위 클래스에서이 작업을 수행하고 싶습니다. ' – osrl

+0

@osrl, 내 업데이트 참조 – foundry

+0

'올바른 크기로 override func layoutSubviews()가 표시되지만 이번에는 보기가보기 컨트롤러의보기에 추가되지 않았습니다. "또는 적어도 나는 그것을 볼 수 없습니다. – osrl

0

UIView에 IBOutlet이 있고 viewDidLayoutSubviews() 메서드에서 yourViewOutlet.frame.size 크기를 가져야합니다.

+0

죄송합니다, 누락 된 정보를 추가했습니다. – osrl

0

viewDidLayoutSubviews()이 여러 번 호출되기 때문에 viewDidAppear() 대리인을 사용하는 것이 좋습니다.

viewDidLoad()은 프레임이 설정되기 전에 호출됩니다.

viewDidLayoutSubviews()은 프레임 크기 조정 중에 호출되며 다른 프레임 크기 (일반적으로 프레임이 계산되기 전에 frameZero)가 여러 번 호출됩니다.

viewDidAppear() 모든 프레임이 설정됩니다.

+0

죄송합니다. 누락 된 정보를 추가했습니다. – osrl

관련 문제