2013-11-13 5 views
2

Приложение iOS 7 Quora, похоже, отображает UISearchBar в главном UINavigationBar UINavigationController. Поиск инициируется нажатием правой кнопки на панели и анимацией справа. Кажется, все происходит в одном контроллере.Воспроизведение приложения Quora iOS 7 UISearchBar

Apple представила свойство displaySearchBarInNavigationBar для UISearchDisplayController в iOS 7, но я не верю, что Quora использовали это. Невозможно иметь заголовокView на панели навигации, если он установлен, и приложение Quora, безусловно, похоже, имеет это.

Приложение Apple Calendar использует отдельный контроллер просмотра для поиска, но сохранение поиска в том же контроллере просмотра, что и контент, как и Quora, является более приятным для пользователя.

Единственный способ, которым я решил сделать это, - это использовать пользовательские переходы UIViewController, но это похоже на перебор. Есть ли более простой способ создать это?

+0

Что вы подразумеваете под «Невозможно иметь заголовокView в панели навигации при установке, и приложение Quora, безусловно, похоже, имеет это».? – TomSwift

+0

Из [UISearchDisplayController] (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UISearchDisplayController_Class/Reference/Reference.html#//apple_ref/occ/instp/UISearchDisplayController/navigationItem) документация мое понимание что настройка displaySearchBarInNavigationBar заставляет использовать навигационный элемент контроллера отображения, который не может иметь titleView – edlea

ответ

2

Вот быстрый контроллер просмотра образцов, который я написал, чтобы подражать эффекту «расширяющегося поля поиска» Quora. Я оставлю это для вас, чтобы включить в таблицу «результаты поиска».

Я использовал UITextField (подклассы, чтобы я мог изменить цвет текста заполнителя ...), но вы МОЖЕТЕ использовать UISearchBar. Или вы можете создать собственное представление, которое содержит UITextField и любую кнопку «закрыть». В моем примере я использовал правую кнопку UITextField, чтобы удерживать кнопку закрытия; в случае с Quora у них есть кнопка закрытия за пределами текстового поля, например, реальная UISearchBar. Но я не думаю, что вы можете изменить текст/изображение кнопки закрытия на UISearchBar (по крайней мере, не легко).

Возможно, вы могли придумать решение, которое бы полностью интегрировало встроенный searchViewController, но это может быть слишком большой проблемой для его стоимости.

@interface TSTextField : UITextField 
@end 
@implementation TSTextField 
- (void) drawPlaceholderInRect: (CGRect) rect 
{ 
    CGFloat fontHeight = self.font.lineHeight; 

    CGFloat yOffset = (rect.size.height - fontHeight)/2.0; 

    rect = CGRectMake(0, yOffset, rect.size.width, fontHeight); 

    [[self placeholder] drawInRect: rect 
        withAttributes: @{ NSFontAttributeName : self.font, 
             NSForegroundColorAttributeName : self.isEditing ? self.textColor : [UIColor whiteColor] }]; 
} 
@end 

@interface TSViewController() <UITextFieldDelegate> 
@end 

@implementation TSViewController 

- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.navigationController.navigationBar.barTintColor = [UIColor redColor]; 

    UITextField* searchField = [[TSTextField alloc] initWithFrame: CGRectMake(0, 0, 85, 30)]; 
    searchField.backgroundColor = [UIColor clearColor]; 
    searchField.borderStyle = UITextBorderStyleNone; 
    searchField.textColor = [UIColor whiteColor]; 
    searchField.textAlignment = NSTextAlignmentRight; 
    searchField.placeholder = @"Search"; 
    searchField.delegate = self; 

    UIButton* magnifyButton = [UIButton buttonWithType: UIButtonTypeSystem]; 
    [magnifyButton setTitle: @"" forState: UIControlStateNormal]; 
    [magnifyButton sizeToFit]; 
    [magnifyButton addTarget: self action: @selector(close:) forControlEvents: UIControlEventTouchUpInside]; 
    searchField.leftView = magnifyButton; 
    searchField.leftViewMode = UITextFieldViewModeAlways; 

    UIButton* closeButton = [UIButton buttonWithType: UIButtonTypeSystem]; 
    [closeButton setTitle: @"ⓧ" forState: UIControlStateNormal]; 
    [closeButton sizeToFit]; 
    [closeButton addTarget: self action: @selector(close:) forControlEvents: UIControlEventTouchUpInside]; 
    searchField.rightView = closeButton; 
    searchField.rightViewMode = UITextFieldViewModeWhileEditing; 

    UIBarButtonItem* bbi = [[UIBarButtonItem alloc] initWithCustomView: searchField]; 
    self.navigationItem.rightBarButtonItem = bbi; 

} 

- (BOOL) textFieldShouldBeginEditing:(UITextField *)textField 
{ 
    UITextField* searchField = (UITextField*)self.navigationItem.rightBarButtonItem.customView; 
    searchField.borderStyle = UITextBorderStyleRoundedRect; 
    searchField.backgroundColor = [UIColor whiteColor]; 
    searchField.textColor = [UIColor blackColor]; 
    searchField.text = @""; 
    searchField.textAlignment = NSTextAlignmentLeft; 

    [UIView transitionWithView: searchField 
         duration: 0.25 
         options: UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionTransitionCrossDissolve 
        animations:^{ 

         searchField.frame = CGRectMake(0, 0, 290, searchField.frame.size.height); 
        } 
        completion: nil]; 

    return YES; 
} 

- (void) close: (id) sender 
{ 
    UITextField* searchField = (UITextField*)self.navigationItem.rightBarButtonItem.customView; 
    searchField.rightViewMode = UITextFieldViewModeNever; 

    [UIView transitionWithView: searchField 
         duration: 0.25 
         options: UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionTransitionCrossDissolve 
        animations:^{ 

         searchField.frame = CGRectMake(0, 0, 85, searchField.frame.size.height); 
         searchField.backgroundColor = [UIColor clearColor]; 
         searchField.text = @""; 
         searchField.borderStyle = UITextBorderStyleNone; 
         searchField.textColor = [UIColor whiteColor]; 
         searchField.textAlignment = NSTextAlignmentRight; 

         [searchField resignFirstResponder]; 
        } 

        completion:^(BOOL finished) { 

         searchField.rightViewMode = UITextFieldViewModeWhileEditing; 
        }]; 
} 

@end 
+0

Это замечательно, спасибо. Раньше я не использовал transitionWithView, и это, по-видимому, ключ. Как отмечает @TomSwift, для читателя требуется немного дополнительной работы, но это фантастический ответ. – edlea

Смежные вопросы