Эту ошибку действительно сложно устранить, мой 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)
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
-------------------------------------