Воссоздание приложения Quora iOS 7 UISearchBar

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

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

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

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


person edlea    schedule 13.11.2013    source источник
comment
что вы имеете в виду под «Невозможно иметь titleView на панели навигации, когда он установлен, и приложение Quora, похоже, имеет это»?   -  person TomSwift    schedule 13.11.2013
comment
Из Документация по UISearchDisplayController Насколько я понимаю, настройка DisplaySearchBarInNavigationBar вызывает использование navigationItem контроллера дисплея поиска, который не может иметь titleView   -  person edlea    schedule 13.11.2013


Ответы (1)


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

Я использовал UITextField (в подклассе, чтобы я мог изменить цвет текста заполнителя ...), но вы МОЖЕТЕ использовать UISearchBar. Или вы можете захотеть создать собственное представление, содержащее UITextField и любую кнопку «закрыть». В моем примере я использовал UITextField rightView, чтобы удерживать кнопку закрытия; в случае с 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
person TomSwift    schedule 13.11.2013
comment
Это здорово, спасибо. Раньше я не использовал transitionWithView, и это, кажется, ключ. Как упоминает @TomSwift, от читателя требуется немного дополнительной работы, но это фантастический ответ. - person edlea; 14.11.2013