4

UITooolbar에 UITextField를 추가하고 UITextField가 UIBarButtonSystemItemFlexibleSpace처럼 영역을 채우기 위해 필요에 따라 너비를 확장하게하고 싶습니다. 다음은 자동 레이아웃을 사용하여 iOS 11에서 유연한 너비로 UITextField를 추가하는 방법

는 다음과 같이 표시 할 ...

// two UIBarButtonItems 
UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:nil]; 
UIBarButtonItem *right = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:nil action:nil]; 

// the UIBarButtonItem with a UITextField as custom view 
UITextField *textField = [[UITextField alloc] init]; 
textField.borderStyle = UITextBorderStyleRoundedRect; 
UIBarButtonItem *text = [[UIBarButtonItem alloc] initWithCustomView:textField]; 

[self setToolbarItems:@[left, text, right]]; 

... 내가 일반적으로 뷰 컨트롤러의 도구 모음 항목을 설정하는 방법에 대한 코드 조각입니다.

난 UIToolbar를 하위 분류 모든 '비가요'항목에 대한 폭 ( CGRectGetWidth(itemView.frame))을 얻고 텍스트 필드는 프레임 뷰 가능한 폭을 계산 layoutSubviews 방법을 사용 iOS의 11 전에

ios11_toolbar

. iOS 11에서 Apple은 모든 막대를 WWDC2017 session 204에서 설명한 바와 같이 자동 레이아웃으로 변경했으며 웨이는 iOS 11 UIBarButtonItem images not sizing으로 지적 된보기가 표시 될 때까지 유효한 너비를 제공하지 않습니다.

두 항목 사이의 전체 빈 영역을 채우기 위해 확장되는 자동 레이아웃과 구속 조건을 사용하여 customViews에 유연한 크기의 UIBarButtonItem을 추가 할 수 있습니까?

편집 1 : 난 단지 텍스트 필드를 추가 할 경우 예상대로

이 항목의 폭을 확장됩니다.

ios11_toolbar_textfield_only

편집 2 : UIToolbar 내

사용 제약이 직접 아이템 뷰 (? 그들이 배치 될 때까지) 비 존재하지 않는다 또는 수퍼를 가지고 있지 않는 한 불가능한 것으로 보인다. 내가 제약 조건을 추가하려면 다음 코드 조각과 함께 끝났다 view hierarchy for UIToolbar 확인에 대한 아이디어와

...

// _UIToolbarContentView 
// + _UIButtonBarStackView 
//  + _UIButtonBarButton 
//  + UIView 
//  + _UITAMICAdaptorView 
//  + UIView 
// 

UIView *contentView = nil; 
for (UIView *view in self.navigationController.toolbar.subviews) { 
    if ([view.description containsString:@"ContentView"]) { 
     contentView = view; 
    } 
} 

UIView *stackView = nil; 
for (UIView *view in contentView.subviews) { 
    if ([view.description containsString:@"ButtonBarStackView"]) { 
     stackView = view; 
    } 
} 

// constrain views on stack 
UIView *uiButtonBarButton = [stackView.subviews objectAtIndex:0]; 
[uiButtonBarButton.leadingAnchor constraintEqualToAnchor:stackView.leadingAnchor].active = YES; 

UIView *uiTAMICAdaptorView = [stackView.subviews objectAtIndex:2]; 
[uiTAMICAdaptorView.leadingAnchor constraintEqualToAnchor:uiButtonBarButton.trailingAnchor].active = YES; 
[uiTAMICAdaptorView.trailingAnchor constraintEqualToAnchor:stackView.trailingAnchor].active = YES; 

... 것 : EDIT 3

UIBarButtonItem *left = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:nil]; 
UIView *leftView = [left valueForKey:@"view"]; 
UIBarButtonItem *right = [[UIBarButtonItem alloc] initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:nil action:nil]; 
UIView *rightView = [right valueForKey:@"view"]; 

UITextField *textField = [[UITextField alloc] init]; 
textField.borderStyle = UITextBorderStyleRoundedRect; 
UIBarButtonItem *text = [[UIBarButtonItem alloc] initWithCustomView:textField]; 

NSDictionary *views = NSDictionaryOfVariableBindings(leftView, textField, rightView); 
NSString *formatString = @"|-[leftView]-[textField]-[rightView]-|"; 

NSArray *constraint = [NSLayoutConstraint constraintsWithVisualFormat:formatString options:NSLayoutFormatAlignAllCenterX metrics:nil views:views]; 
[NSLayoutConstraint activateConstraints:constraint]; 

[self setToolbarItems:@[left, text, right]]; 

다음과 같이보기를 변경하십시오.

enter image description here

왜 UIBarButton의 크기가 변경되고 UITextField 일명 UITAMICAdaptorView가 아닌지? 제약과 UIBarButton의 크기를 고정

...

[uiButtonBarButton.widthAnchor constraintEqualToConstant:CGRectGetWidth(uiButtonBarButton.frame)].active = YES; 

는 ... ...처럼 보이는

enter image description here

...하지만 UIButtonBarButton의 불행하게도 프레임은 아니다 아이템이 놓일 때까지 유효합니다.

UIButtonBarButton을 알지 못하는 채로 폭을 제한하는 방법. 'notGreaterThanNecessary'같은 것이 있습니까?

+1

나는 비슷한 질문을하고 해결책으로 뭔가를 썼다. 다음을보십시오 : https://stackoverflow.com/questions/46581263 – lucasl

+0

@lucasl 정확히 내가 원하는 것은 아니지만 툴바 서브 뷰를 가로 지르는 것에 대한 아이디어는 훌륭합니다. 나는 새로운 지식으로 나의 질문을 편집했다. – grethi

+0

iOS 11을 시작하면 UIToolBar에 추가 된 UIBarButtonItems에 더 이상 수퍼 뷰가 없기 때문에 뷰가로드 될 때 제약 조건을 설정할 수 없습니다. – mnabaa

답변

0

하나의 UIView를 단일 UIBarButtonItem에 직접 넣으면 UIToolBar의 전체 너비가됩니다.

이제 레이아웃 제약 조건을 사용하여 원하는대로 모든 하위 뷰를 추가 할 수 있습니다. 수평 적 UIStackView는 여기서 아주 잘 작동 할 것입니다.

관련 문제