레이아웃 제약 조건을 언제 활성화/비활성화할 수 있습니까?
IB에 여러 개의 제약 조건을 설정했는데, 어떤 상태에 따라 프로그래밍 방식으로 서로 전환하고 싶습니다.뭐가 있어요.constraintsA모두 두 션에서 ,고 a.constraintsB모두 IB에 설치되지 않은 콘센트 컬렉션입니다.
다음과 같이 두 세트 사이를 프로그래밍 방식으로 전환할 수 있습니다.
NSLayoutConstraint.deactivateConstraints(constraintsA)
NSLayoutConstraint.activateConstraints(constraintsB)
하지만.. 언제 해야할지 모르겠어요한 번쯤은 그럴 수 있을 것 같습니다.viewDidLoad요,한테 view.updateConstraints()그리고.view.layoutSubviews()제약 조건을 설정한 후에, 아무 소용이 없습니다.
을 안에 할 수 있었습니다.viewDidLayoutSubviews모든 것이 예상대로 작동합니다.저는 두 가지를 알고 싶습니다.
- 왜 이런 행동을 하는 거지?
- ViewDidLoad에서 제약 조건을 활성화/비활성화할 수 있습니까?
및 NSLayoutConstraints인에viewDidLoad에 아무런 .효과가 있습니다.입니다 :-)
제 설정에 대해서만 설명하겠습니다. 아마도 이를 통해 여러분에게 단서를 제공할 수 있을 것입니다.
- 설정했습니다.
@IBOutlets활성화/비활성화에 필요한 모든 제약 조건에 대해 설명합니다. -
ViewController즉 합니다.그 이유는 제약 조건을 비활성화한 후에는 다시 활성화할 수 없다는 것을 발견했기 때문입니다. - 0이었습니다.그래서 비활성화되면 삭제되는 것 같습니다. - 사용하지 않습니다.
NSLayoutConstraint.deactivate/activate너처럼 나도 사용합니다.constraint.active = YES/NO대신. - 조건을 에, 에 를 합니다.
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그들에 대한 언급.
뷰를 생성할 때는 다음 라이프사이클 메소드가 순서대로 호출됩니다.
- loadView
- viewDidLoad
- viewWill 표시
- viewWillLayoutSubviews
- 뷰DidLayoutSubviews
- view Did 출현
이제 여러분의 질문을.
- 왜 이런 행동을 하는 거지?
조건을 하려고 할 때:viewDidLoad뷰에 경계가 없으므로 제약 조건을 설정할 수 없습니다.viewDidLayoutSubviews뷰의 경계가 확정된 것입니다.
- ViewDidLoad에서 제약 조건을 활성화/비활성화할 수 있습니까?
정답: 아니오.위에서설명한이유.
, 했습니다를 할 때 하는 한 했습니다.- (void)updateConstraints cae c),estrong활성 제약 조건과 비활성 제약 조건을 사용한 초기화에 대한 참조. 뷰 및다를 합니다.layoutIfNeeded
중요한 은 입니다의 입니다.updateConstraints한,해라고 한 제약 의 활성화를 할 수 .updateConstraint 첫 및s 후.보기 사이클에서 그 이후가 중요한 것 같습니다.
언급URL : https://stackoverflow.com/questions/27494542/when-can-i-activate-deactivate-layout-constraints
'programing' 카테고리의 다른 글
| 인덱스를 사용하여 InnoDB에서 COUNT(*) 성능을 최적화하는 방법 (0) | 2023.09.26 |
|---|---|
| Angular에서 lodash를 가져오고 사용하는 올바른 방법 (0) | 2023.09.26 |
| WP 미디어 라이브러리 그리드 보기가 표시되지 않음 (0) | 2023.09.26 |
| Moment.js - 반올림하지 않고 날짜 이후의 연도를 얻으려면 어떻게 해야 합니까? (0) | 2023.09.26 |
| 어떤 상황에서 malloc이 NULL을 반환할 수 있습니까? (0) | 2023.09.26 |