2016-09-12 1 views
6

내가 원형보기를 만들기 위해이 기술을 사용했습니다 :iOS10 SDK에서보기 프레임 크기는 언제 설정됩니까? 스위프트와 ObjC에서 몇 년 동안

있는 viewDidLoad에서이 코드를 넣어 아무 문제가 없었다 스토리 보드에서 UILayoutConstraints는 너비/높이를 고정
view.layer.cornerRadius = view.frame.size.width/2 
view.clipsToBounds = true 

, 또는 in viewWillAppear. iOS9.3SDK 내장이 iOS10에서 잘 실행 등

iOS10SDK도 viewWillAppear까지 FRAMESIZE 스토리 보드에 고정 된 크기로 완전히 다른 표시, 등 viewDidLayoutSubviews에 내 옵션은 다음과 같습니다

1) 할 이 viewDidAppear (끔찍한 솔루션) 2) 하드 코드 cornerRadius (잘 작동하지만 끔찍한)

이 버그는 Storboard의 고정 너비/높이 세트가 최소한 경고없이 변경되면 안되기 때문에 버그처럼 보입니다. 콘솔). 또는이 코드에 다른 장소가 있습니까? 이 오늘 나에게 모든 일을 귀찮게했다

enter image description here

+1

모든 IB 생성 뷰에는 viewDidLoad 및 기타 많은 코드 부분에서 {1000,1000}의 초기화되지 않은 프레임 크기가 새로 추가되었습니다. cellForRowAtIndexPath를 포함한 – Miro

+0

프레임 폭 높이 대신 제약 폭/높이를 직접 사용하는 것이 합리적인 해결책이라는 것을 알게되었습니다. http://stackoverflow.com/questions/39475456/ios10-viewdidload-frame-width-height-not-initialized-correctly-anymore-1000-10 – Miro

+0

안녕하세요 @Miro - 정확히 내가 본 것 (1000 기본값). 나는 또한 높이를 직접 설정했다.나는 또한 애플이 뷰 레이아웃 코드에서 많은 것들을 바꾼다는 것을 의미하는 NSLayoutConstraints와 관련된 문제를 가지고있다 :-) – Peter

답변

5

iOS 10에서는 6 월에 Xcode 8을 베타 버전으로 사용하기 시작한 직후이 문제를 만났습니다. 이 솔루션이 필요합니다 :

가 바로 계층 수정하기 전에 layoutIfNeeded()을 넣어 :

self.view.layoutIfNeeded() 

view.layer.cornerRadius = view.frame.size.width/2 
view.clipsToBounds = true 

또는

자리 코드를 코너 반경 viewDidLayoutSubviews() 방법 :

override func viewDidLayoutSubviews() { 

    view.layer.cornerRadius = view.frame.size.width/2 
    view.clipsToBounds = true 

} 
3

(테스트 코드의 스크린 샷 첨부). 몇 가지 점에서 동일한 문제가 발생했습니다. 맞춤 UI 요소를 그리거나 뷰에 스타일을 적용하고 특히 모서리 반경을 변경하는 데 올바른 프레임 크기가 필요했습니다. 내가 찾은 해결책은 다음과 구현의 UIViewController의 서브 클래스를 생성 :이 스토리 보드에 내 모든 문제를 해결

class BaseViewController: UIViewController { 

    /** 
     This is a helper property and a helper method that will be called 
     when the frame is calculated, but will prevent the formatting code 
     being called more than once 
    */ 
    private var didCalculateInitialFrame = false 
    private func checkIfFrameWasCalculated() { 
     if self.didCalculateInitialFrame == false { 
      self.viewDidCalculateInitialFrame() 
      self.didCalculateInitialFrame = true 
     } 
    } 

    //-- This is where you will tie your helper method with the view lifecycle 
    override func viewDidLayoutSubviews() { 
     super.viewDidLayoutSubviews() 
     self.checkIfFrameWasCalculated() 
    } 

    /** 
     This is an overridable function that you will implement 
     in your subclasses, in case you need to use this approach 
     in multiple places of your app. 
    */ 
    func viewDidCalculateInitialFrame() { 

    } 
} 

. 이것이 도움이되기를 바랍니다.

+0

안녕 알렉스 - 그건 매우 도움이된다. (upvoted). 나는 이것을 할 수있는 '적절한'방법이 있어야한다고 느낄 때 대답을 받아들이는 것을 미뤘으며 이것은 일시적인 해결 방법처럼 느껴진다. 답변을 많이 주셔서 감사합니다. – Peter

+0

피터, 감사합니다 - 완전히 당신과 함께! 적절한 방법이 문서화되면이 대답을 확실히 업데이트하고 있습니다. 어쨌든 새로운 뷰 컨트롤러 수명주기와 함께 사용했던 프로젝트와 iOS 10/Xcode 8.0 GM에서 뷰 프레임을 언제 어떻게 계산했는지 공유했습니다. 여기 [link] (https://github.com/al7/TestViewDidLoad)에서 찾을 수 있습니다. –

0

이가 ios10에서 문제가있는 것 같습니다.

컨트롤러 메서드 viewDidLayoutSubviews() 또는 을 재정의하면 해결할 수 있습니다.이 메서드를 호출하기 전에 layoutIfNeeded() 메서드를 호출하여 치수를 가져 오기 전에 필요한 치수 값을 확인합니다. 오브젝티브 C : viewObject layoutIfNeeded] 스위프트 : 치수 값은 여전히 ​​정확하지 viewObject.layoutIfNeeded()

이라면 뷰 객체의 부모 보려면 layoutIfNeeded 방법을 사용한다.

관련 문제