UISearchDisplayController Анимация UISearchBar в UIScrollView под UIPageControl

Эту ошибку действительно сложно устранить, мой ObjC-fu только начинающий, и моя уверенность рушится, чем дольше я изучаю эту симпатичную ошибку...

Приложение должно иметь представление (назовем его mainView) с UIPageControl и UIScrollView, чтобы иметь 2 представления, прокручиваемые по горизонтали. Поэтому я реализовал это, добавив:

// This is added on viewDidLoad...
[self addChildViewController:[self.storyBoard instantiateViewControllerWithIdentifier:@"VC1"]];
[self addChildViewController:[self.storyBoard instantiateViewControllerWithIdentifier:@"VC2"]];

// Further processing of the child view controllers...
self.scrollView.pagingEnabled = YES;

for (NSUInteger i = 0; i < [self.childViewControllers count]; i++) {
    UIViewController *controller = [self.childViewControllers objectAtIndex:page];
    CGRect frame = self.scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    controller.view.frame = frame;
    [self.scrollView addSubview:controller.view];
}

// Expanding scroll view's content size for scrolling...
self.scrollView.contentSize = CGSizeMake(
    scrollView.frame.size.width * [self.childViewControllers count], 
    scrollView.frame.size.height);

Обратите внимание, что mainView сам оснащен UISearchDisplayController UISearchBar скрытым за кадром. (Не уверен, что эта информация жизненно важна.)

Проблема заключается во втором контроллере дочернего представления с идентификатором VC2, который также оснащен UISearchDisplayController с UISearchBar, и когда панель поиска закрывается при завершении поиска, анимация каким-то образом заставляет VC2 UISearchBar перемещаться в CGRect(0, 0, 320, 40) из mainView вместо VC2. Следовательно, UISearchBar VC2 "деформировался" обратно в VC1.

Первая попытка решить эту проблему состоит в том, чтобы поместить каждый дочерний контроллер представления в другое представление, надеясь, что CGRect(0, 0, 320, 40) из UISearchBar VC2 останется в VC2, но безрезультатно:

for (NSUInteger i = 0; i < [self.childViewControllers count]; i++) {
    UIViewController *controller = [self.childViewControllers objectAtIndex:page];
    CGRect frame = self.scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    //controller.view.frame = frame;
    UIView *container = [[UIView alloc] initWithFrame:frame];
    [container addSubview:controller.view];
    [self.scrollView addSubview:container];
}

Каким-то образом я предполагаю, что когда UISearchDisplayController VC2 анимирует, это UISearchBar, а frame, который он использует, на самом деле является одним из self.UIScrollView, но я не уверен.

Может ли кто-нибудь пролить свет на эту ошибку и сжечь ее до смерти, пожалуйста? Это в iOS7

     Main View
-------------------
|      VC1        |       VC2
-------------------------------------
|                 |_________________| <- Search Bar (This will 'warped' to VC1 at the same
|                 |                 |    position on end editing)
|                 |                 |
|                 |                 |
|                 |                 |
|                 |                 |
|                 |                 |
|                 |                 |
|                 |                 |
|                 |                 |
-------------------------------------

person J.L    schedule 19.06.2014    source источник


Ответы (1)


Нашел решение, странное, но оно работает, получил идею от Панель поиска исчезает из представления заголовка в iOS 7 после того, как было обнаружено, что адрес памяти суперпредставления UISearchBar был изменен при завершении поиска.

Следующий фрагмент кода был добавлен для любого из возможных делегированных методов, а именно viewWillAppear, searchDisplayControllerWillEndSearch:, searchDisplayControllerDidEndSearch::

if (self.searchDisplayController.searchBar.superview != self.searchDisplayController.searchContentsController.view) {
    [self.searchDisplayController.searchBar removeFromSuperview];
    [self.searchDisplayController.searchContentsController.view addSubview:self.searchDisplayController.searchBar];
}

Приму это как ответ, но все же, если с этим что-то не так, поделитесь. Спасибо большое.

person J.L    schedule 19.06.2014