2017-12-17 21 views
-1

모든 것이 유연한 높이/너비를 사용하거나 translatesAutoresizingMaskIntoConstraints를 false로 설정한다는 것에 대해 수많은 질문이 있습니다.슈퍼 뷰로드가 완료되면 서브 뷰 크기 조정

extension UIView { 
    func addView(storyboard: String, viewIdentier: String) { 
     let story = UIStoryboard(name: storyboard, bundle: nil) 
     let subview = story.instantiateViewController(withIdentifier: viewIdentifier) 
     subview.view.frame = self.bounds 
     self.addSubview(subview.view) 
    } 
} 

내가 잘 작동 ViewDidAppear의 모든 일에, 뷰를 초기화하려면이 옵션을 사용하는 경우 :

나는 내가 만든 확장을 사용하여보기를 추가해야합니다. 그러나 뷰의 뷰가로드 된 경우에는 뷰가 포함 된 contrainView에 아직로드되지 않은 자체 제약 조건이 있으므로 제약 조건이 모든 곳에서 적용됩니다.

나는 현재 같이 사용

@IBOutlet weak var container: UIView! 

override func viewDidLoad() { 
    container.addView(storyboard: "Modules", viewIdentifier: "subview") 
} 

내가 때문에 이유의 ViewDidAppear에서보기를 초기화하고 싶지 않아요. 이 문제를 고칠 방법이 있습니까? 또는 superview로드 한 후 subview 제약 조건을 다시로드 할?

또한 다른 솔루션을 사용해 보았습니다. 나는이 일을 할 수 없어 정말 도움이된다고 생각합니다.

답변

1

코드가 제안하는 하드 코드 방식으로 작업 할 수있는 방법이 없습니다. self.bounds을 기반으로 하위보기의 프레임을 설정합니다. 그러나 viewDidLoad에서 우리는 self.bounds의 최종 값을 아직 모릅니다. 너무 이르다.

레이아웃 값을 알고 있는지 여부에 따라 달라지는 작업은 레이아웃이 완료된 후, 즉 viewDidLayoutSubviews입니다. 이것은 앱의 수명 기간 동안 여러 번 호출 될 수 있다는 점에 유의하십시오. 그런 일이 발생할 때마다 하위보기를 다시 추가하고 싶지 않으므로 Bool 플래그를 사용하여 하위보기를 한 번만 추가해야합니다. 서브 뷰를 적절히 조정하기 위해 수퍼 뷰의 후속 크기 조정시 viewDidLayoutSubviews에서 다른 작업을 수행해야 할 수 있습니다.

그러나 이런 종류의 일을 할 수있는 올바른 방법은 (아마도 viewDidLoad에서) 하위 뷰를 추가하고 프레임은 이제부터 자사의 superview 에 관계없이의를 올바른 상대적으로 남아 있도록 그것을 제약을 제공하는 것입니다 때 수퍼 뷰의 크기를 조정하는 방법 당신은 당신의 질문에, 그런 종류의 접근을 거부하는 것처럼 보이지만 그럼에도 불구하고 옳은 일이며 당신은 그것에 대한 당신의 저항을 떨어 뜨려야합니다.

+0

하하! 좋아 매트. 조언 해주셔서 감사합니다. 나는 그 대답이 될 것이라고 생각했다. – LateNate

+0

나는 그 느낌이 들었다고 느꼈다 ...! :) 그러나 적어도 지금은 자신의 방식이 파멸되었음을 이해하고 크기 조정에 대한 일종의 실시간 응답을 구성하는 것이 올바른 방법이되기를 바랍니다. – matt