programing

레이아웃 제약 조건을 언제 활성화/비활성화할 수 있습니까?

easyjava 2023. 9. 26. 22:38
반응형

레이아웃 제약 조건을 언제 활성화/비활성화할 수 있습니까?

IB에 여러 개의 제약 조건을 설정했는데, 어떤 상태에 따라 프로그래밍 방식으로 서로 전환하고 싶습니다.뭐가 있어요.constraintsA모두 두 션에서 ,고 a.constraintsB모두 IB에 설치되지 않은 콘센트 컬렉션입니다.

다음과 같이 두 세트 사이를 프로그래밍 방식으로 전환할 수 있습니다.

NSLayoutConstraint.deactivateConstraints(constraintsA)
NSLayoutConstraint.activateConstraints(constraintsB)

하지만.. 언제 해야할지 모르겠어요한 번쯤은 그럴 수 있을 것 같습니다.viewDidLoad,한테 view.updateConstraints()그리고.view.layoutSubviews()제약 조건을 설정한 후에, 아무 소용이 없습니다.

을 안에 할 수 있었습니다.viewDidLayoutSubviews모든 것이 예상대로 작동합니다.저는 두 가지를 알고 싶습니다.

  1. 왜 이런 행동을 하는 거지?
  2. ViewDidLoad에서 제약 조건을 활성화/비활성화할 수 있습니까?

NSLayoutConstraints인에viewDidLoad에 아무런 .효과가 있습니다.입니다 :-)

제 설정에 대해서만 설명하겠습니다. 아마도 이를 통해 여러분에게 단서를 제공할 수 있을 것입니다.

  1. 설정했습니다.@IBOutlets활성화/비활성화에 필요한 모든 제약 조건에 대해 설명합니다.
  2. ViewController 즉 합니다.그 이유는 제약 조건을 비활성화한 후에는 다시 활성화할 수 없다는 것을 발견했기 때문입니다. - 0이었습니다.그래서 비활성화되면 삭제되는 것 같습니다.
  3. 사용하지 않습니다.NSLayoutConstraint.deactivate/activate너처럼 나도 사용합니다.constraint.active = YES/NO대신.
  4. 조건을 에, 에 를 합니다.view.layoutIfNeeded().

를 확인할 수도 있습니다. 로 대체합니다.

은 그것이 ㅇ·active = NOtself.yourConstraint = nil, 당신이 사용할 수 없게 말입니다.self.yourConstraint시.

override func viewDidLayoutSubviews() {
// do it here, after constraints have been materialized
}

저는 있는 문제가 합니다 의 견해에 합니다.viewDidLoad()라고 합니다.다음과 같은 여러 가지 옵션이 있습니다.

A)레이아웃 제약 조건을 IBO 콘센트에 연결하고 이러한 참조를 통해 코드의 제약 조건에 액세스할 수 있습니다.콘센트는 연결이 되어 있기 때문에viewDidLoad()시작합니다. 제약 조건에 접근할 수 있어야 하며 제약 조건을 계속 활성화 및 비활성화할 수 있습니다.

B)UIView's를 사용하시려면constraints() 조건에 nviewDidLayoutSubviews()시작하고 실행하는 것은 설치된 제약 조건이 있을 것이라는 점을 nib에서 뷰 컨트롤러를 만든 후 첫 번째 지점이기 때문입니다.요에 하는 거 layoutIfNeeded()일이 끝나면이 있을 가 두 번 이 없는지 .이는 적용할 변경 사항이 있을 경우 레이아웃 패스가 두 번 수행된다는 단점이 있으며 무한 루프가 트리거될 가능성이 없는지 확인해야 합니다.

경고의 빠른 말: 비활성화된 제약 조건은 에 의해 반환되지 않습니다. constraints() method! 나중에 다시 켜려는 의도로 제약 조건을 비활성화하면 해당 제약 조건에 대한 참조를 유지해야 합니다.

C)스토리보드 접근 방식은 잊어버리고 제약 조건을 수동으로 추가할 수 있습니다.네가 이걸 하고 있으니깐viewDidLoad()저는 그 의도가 즉석에서 레이아웃을 바꾸는 것이 아니라 그 물건의 완전한 생애 동안 한 번만 하는 것이라고 생각하기 때문에, 이것은 수용할 수 있는 방법이어야 합니다.

를 할 수도 .priority속성을 "enable" 및 "disable"로 지정합니다(예를 들어 750개의 값을 활성화하고 250개를 비활성화합니다)..activeBOOL은 제 UI에 아무런 영향을 주지 않았습니다. 필요 layoutIfNeeded 그 및할 수 viewDidLoad다.

사용하지 않는 제약 조건을 비활성화하는 적절한 시간:

-(void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];

    self.myLittleConstraint.active = NO;
}

하세요를 하세요.viewWillLayoutSubviews여러 번 호출할 수도 있으니까 계산을 많이 할 필요는 없겠죠?

일부 : 합니다를 strong그들에 대한 언급.

뷰를 생성할 때는 다음 라이프사이클 메소드가 순서대로 호출됩니다.

  1. loadView
  2. viewDidLoad
  3. viewWill 표시
  4. viewWillLayoutSubviews
  5. 뷰DidLayoutSubviews
  6. view Did 출현

이제 여러분의 질문을.

  1. 왜 이런 행동을 하는 거지?

조건을 하려고 할 때:viewDidLoad뷰에 경계가 없으므로 제약 조건을 설정할 수 없습니다.viewDidLayoutSubviews뷰의 경계가 확정된 것입니다.

  1. ViewDidLoad에서 제약 조건을 활성화/비활성화할 수 있습니까?

정답: 아니오.위에서설명한이유.

, 했습니다를 할 때 하는 한 했습니다.- (void)updateConstraints cae c),estrong활성 제약 조건과 비활성 제약 조건을 사용한 초기화에 대한 참조. 뷰 및다를 합니다.layoutIfNeeded

중요한 은 입니다의 입니다.updateConstraints한,해라고 한 제약 의 활성화를 할 수 .updateConstraint 첫 및s 후.보기 사이클에서 그 이후가 중요한 것 같습니다.

언급URL : https://stackoverflow.com/questions/27494542/when-can-i-activate-deactivate-layout-constraints

반응형