2013-02-20 2 views
21

autolayout이 활성화 된 iOS보기가 있으며 UIToolbarUISearchBarUISegmentControl이 포함되어 있습니다. UISearchBar에 유연한 너비가 있어야하므로 강제로 제약 조건을 추가해야하지만 인터페이스 빌더의 UIToolbar에있는 항목에 제약 조건을 추가 할 수 없다고 말할 수 있습니다. 옵션이 모두 비활성화되어 있습니다.iOS Autolayout 및 UIToolbar/UIBarButtonItems

전에 AutoLayout 나는 이것을 autoresizingmasks으로 수행 할 것입니다.

UIToolbars/UINavigationBars 내에 제약 조건이 허용되지 않습니까?

autolayout을 사용할 때 어떻게 이것이 성취 될 수 있습니까?

+0

내가 전에 다음과 같은 몇 가지 물건을했습니다 이러한 솔루션을 찾고있는 동안 두 질문에 stumbbled 기본적으로 뷰의 크기가 변경 될 때까지 기다렸다가 그에 따라 대상 뷰의 프레임을 업데이트합니다. 그것이 자동적으로 할 수있는 방법이 없다는 사실이 밝혀지면 그것은 항상 선택 사항입니다. – Brian

+0

이미지를 게시 할 수 있습니까? –

+0

그래도 AutoLayout을 버리고 자동 크기 조정 마스크를 사용하는 것으로 끝났습니다. 그것은 그 모델을 사용하여 훌륭하게 작동합니다. – outerstorm

답변

23

자동 레이아웃 제약 조건은 UIViews과 그 하위 클래스에서만 작동합니다. UIToolbar 동안

어떤 UIView 기반 항목 (예 : UISearchBarUISegmentedControl)가 UIView에서 상속하지 않습니다 UIBarButtonItems과 공존해야 할 수도 있습니다.

autolayout이 UIBarButtonItems으로 작동 할 때까지 수행 한 것처럼 수행하십시오.

다른 대안은 UIViews에만 기반한 위젯이있는 툴바를 롤하는 것입니다.

+4

애플이이를 해결하기 위해 노력하고 있는지 아시겠습니까? AL과 다른 곳에서 오래된 접근 방법을 사용해야 할 때 불일치가 깨집니다. – Petar

7

적어도 코드에서이를 수행 할 수 있습니다. 필자는 Interface Builder를 버리고 어쨌든 코드로 간다. IB는 제약을 추가하거나 조정할 때 더 자주 방해 받고있는 것 같습니다. 여기 내 사용자 정의 UIToolbar 하위 클래스의 -initWithFrame: 메소드에서 수행 한 작업이 있습니다. 나는 가능한 한 많이 게으른 부하에 좋아하기 때문에

- (instancetype)initWithFrame:(CGRect)frame { 
    if (self = [super initWithFrame:frame]) { 
     [self addSubview:self.label]; 

     [self addConstraint:[NSLayoutConstraint 
          constraintWithItem:self.label 
          attribute:NSLayoutAttributeCenterX 
          relatedBy:NSLayoutRelationEqual 
          toItem:self 
          attribute:NSLayoutAttributeCenterX 
          multiplier:1 constant:0]]; 
     [self addConstraint:[NSLayoutConstraint 
          constraintWithItem:self.label 
          attribute:NSLayoutAttributeCenterY 
          relatedBy:NSLayoutRelationEqual 
          toItem:self 
          attribute:NSLayoutAttributeCenterY 
          multiplier:1 constant:0]]; 
    } 
    return self; 
} 

는 그리고 여기 ([self addSubview:self.label]은 위의 메세지를 취득했을 때에 불려) 내 self.label 인스턴스 변수입니다.

- (UILabel *)label { 
    if (_label) return _label; 
    _label = [UILabel new]; 
    _label.translatesAutoresizingMaskIntoConstraints = NO; 
    _label.textAlignment = NSTextAlignmentCenter; 
    return _label; 
} 

나를 위해 일하는 것 같습니다. 나는 어떤 UIBarButtonItems도 추가하지 않고있다. 그래서 당신의 주행 거리가 다양하다.

+0

제약 조건을 사용하여 기존 툴바의 위치를 ​​변경하려고하면 NSLayoutAttributeCenterX 제약 조건이 매우 유용합니다. – russes

8

이 작업은 스토리 보드에서 바로 수행 할 수도 있습니다.

툴바에 항목을 끌어서 놓기 만하면 원하는 효과를 얻기 위해 일부를 유연한 공간이나 고정 된 공간으로 바꿀 수 있습니다. 아래의 두 가지 예를 참조하십시오.

Evenly spaced

Centered

주의 :이 Aligning UIToolBar items에 내 대답의 복사본입니다, 나는