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 전에
. iOS 11에서 Apple은 모든 막대를 WWDC2017 session 204에서 설명한 바와 같이 자동 레이아웃으로 변경했으며 웨이는 iOS 11 UIBarButtonItem images not sizing으로 지적 된보기가 표시 될 때까지 유효한 너비를 제공하지 않습니다.
두 항목 사이의 전체 빈 영역을 채우기 위해 확장되는 자동 레이아웃과 구속 조건을 사용하여 customViews에 유연한 크기의 UIBarButtonItem을 추가 할 수 있습니까?
편집 1 : 난 단지 텍스트 필드를 추가 할 경우 예상대로
이 항목의 폭을 확장됩니다.
편집 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]];
다음과 같이보기를 변경하십시오.
왜 UIBarButton의 크기가 변경되고 UITextField 일명 UITAMICAdaptorView가 아닌지? 제약과 UIBarButton의 크기를 고정
...
[uiButtonBarButton.widthAnchor constraintEqualToConstant:CGRectGetWidth(uiButtonBarButton.frame)].active = YES;
는 ... ...처럼 보이는
...하지만 UIButtonBarButton의 불행하게도 프레임은 아니다 아이템이 놓일 때까지 유효합니다.
UIButtonBarButton을 알지 못하는 채로 폭을 제한하는 방법. 'notGreaterThanNecessary'같은 것이 있습니까?
나는 비슷한 질문을하고 해결책으로 뭔가를 썼다. 다음을보십시오 : https://stackoverflow.com/questions/46581263 – lucasl
@lucasl 정확히 내가 원하는 것은 아니지만 툴바 서브 뷰를 가로 지르는 것에 대한 아이디어는 훌륭합니다. 나는 새로운 지식으로 나의 질문을 편집했다. – grethi
iOS 11을 시작하면 UIToolBar에 추가 된 UIBarButtonItems에 더 이상 수퍼 뷰가 없기 때문에 뷰가로드 될 때 제약 조건을 설정할 수 없습니다. – mnabaa