ViewDeckを使用していて、UISearchbarを 内に表示したいと考えていleftController
ます。
問題は、ナビゲーションを含む左側を開くと、右側のビットが検索フィールドと重なることです。
上書きすることでこれを取り除きましUISearchBar
た。テキストフィールドは常に同じ幅になりますが、ある場合にはViewDeckが重なっており、別の場合にはViewDeckビットを非表示にしてからキャンセルボタンがスペースを占有します:
UISearchBar のサブクラス化
#import "ViewDeckSearchBar.h"
#define kViewDeckPadding 55
@interface ViewDeckSearchBar()
@property (readonly) UITextField *textField;
@end
@implementation ViewDeckSearchBar
static CGRect initialTextFieldFrame;
- (void) layoutSubviews {
[super layoutSubviews];
// Store the initial frame for the the text field
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
initialTextFieldFrame = self.textField.frame;
});
[self updateTextFieldFrame];
}
-(void)updateTextFieldFrame{
int width = initialTextFieldFrame.size.width - (kViewDeckPadding + 6);
CGRect newFrame = CGRectMake (self.textField.frame.origin.x,
self.textField.frame.origin.y,
width,
self.textField.frame.size.height);
self.textField.frame = newFrame;
}
-(UITextField *)textField{
for (UIView *view in self.subviews) {
if ([view isKindOfClass: [UITextField class]]){
return (UITextField *)view;
}
}
return nil;
}
@end
ViewController クラス
私の Navigation クラスUISearchbarDelegate
では、検索結果を全画面表示にするために、次の 2 つのメソッドを上書きする必要があります。
- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
[self.viewDeckController setLeftSize:0];
// I am also using scopes, which works fine (they fade out when not searching)
self.searchBar.scopeButtonTitles = @[@"Food",
@"Beverages",
@"Misc"];
}
-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{
self.viewDeckController.leftSize = 55;
}
結果
右側に表示されている ViewDeck:
(出典:マイナス.com)
フルスクリーンで検索します (ボタンとスコープ ボタンはアニメーション化されます)。
(出典:マイナス.com)