2014-12-01 5 views
3

동적 상수/배율과 함께 자동 레이아웃 제약 조건 (NSLayoutConstraint)을 사용할 수 있습니까?동적 레이아웃 제약 조건?

예를 들어,이 늪지 표준 NSLayoutConstraint 것이다 :

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:obj1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:obj2 attribute:NSLayoutAttributeLeft multiplier:1 constant:scrollView.contentOffset.x]; 

제 한 것이다 : 여기에

NSLayoutConstraint *constraint = [NSLayoutConstraint constraintWithItem:obj1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:obj2 attribute:NSLayoutAttributeLeft multiplier:1 constant:0]; 

상수에 해당 제약 조건의 변경하지만 동적 변수 것을 scrollviewcontentOffset을 가져 와서 상수로 사용하십시오. 그러나 이것을 시도한 후에는 제약 조건이있을 때 존재하는 오프셋 만 사용합니다.

스크롤 막대가 스크롤 할 때 제약 조건 상수를 업데이트하고 싶습니다. 이 방법을 사용하면 최신의 contentOffset을 계속 사용할 수 있습니다.

이것이 가능합니까? 감사.

답변

6

예.

사실, 그것이 그것이 무엇을 위해 만들어 졌는지입니다. 뷰 등을 애니 메이팅 할 때 ... 제약 조건을 변경할 수 있어야합니다.

NSLayoutConstraint의 유일한 직계 속성은 constant 속성입니다. (권자)

당신은 당신의 코드에 맞지 않습니다.

self.leftConstraint = [NSLayoutConstraint constraintWithItem:obj1 attribute:NSLayoutAttributeLeft relatedBy:NSLayoutRelationEqual toItem:obj2 attribute:NSLayoutAttributeLeft multiplier:1 constant:0]; 

그런 다음 이미 존재하는 제약 조건을 편집 당신이 처음에 대한 속성을 만들 것입니다 제약 조건을 만들기

...

@property (nonatomic, strong) NSLayoutConstraint *leftConstraint; 

그런 다음 그것을 만들 ...

self.leftConstraint.constant = scrollView.contentOffset.x; 

그런 다음보기에서 하위보기를 다시 레이아웃해야합니다.

[self.view layoutIfNeeded]; 
+0

감사합니다. Fogmeister. 이것은 훌륭한데, 비록 layoutIfNeeded를 호출 할 필요는 없지만, 이것 없이는 작동합니다. –

+0

@ JoshKahane 확인해 주셔서 감사합니다. 때로는 필요할 수 있습니다. 예를 들어 제약 조건을 애니메이션화하려면 제약 조건을 변경해야합니다 ** 외부 ** 애니메이션 블록을 호출 한 다음 ** it 내부에서 'layoutIfNeeded'를 호출하십시오. 반 직관적 인 (오늘날의 키워드) 것으로 보이므로 무언가가 작동하지 않는다고 생각하면주의하십시오. – Fogmeister

+1

고맙습니다. 그 이유는 애니메이션을 필요로하기에 충분히 빈번하게 업데이트하고 있었기 때문에'scrollViewDidScroll'에서 상수를 업데이트했기 때문이라고 생각합니다. –

관련 문제