у меня есть tabbarcontroller с 2 вкладками. Я настроил распознаватель жестов смахивания, чтобы пользователи могли перемещаться между вкладками, и пользователи также могут просто нажать на вкладку, чтобы перейти на эту вкладку.
в контроллере представления 2-й вкладки у меня есть подвид в основном представлении. Я настроил подвид с помощью распознавателя жестов панорамирования, который позволяет пользователям перемещать подвид с помощью перетаскивания двумя пальцами. позиция подпредставления по умолчанию — правый нижний угол представления (из раскадровки). если пользователи перетаскивают подпредставление в другое место, я сохраняю центральную точку подпредставления в представлении, которое исчезнет, если пользователи проведут пальцем по первой вкладке или просто коснутся первой вкладки на панели вкладок. когда пользователи возвращаются на 2-ю вкладку (через пролистывание с первой вкладки или нажатием 2-й вкладки на панели вкладок), я устанавливаю центр подпредставления в сохраненное свойство центральной точки в viewWillAppear.
странно, если я вручную перемещаю положение подвида снизу справа (скажем, сверху слева), при смене табуляции происходит следующее
если я перейду с вкладки 2 на вкладку 1, нажав на панель вкладок, а затем вернусь на вкладку 2, проведя пальцем влево - подпредставление останется в правильном «перемещенном» положении, то есть вверху справа.
но если я перейду с вкладки 2 на вкладку 1, проведя пальцем вправо, а затем вернусь к вкладке 2, проведя пальцем влево - подвид сначала на мгновение появится в нижнем правом положении по умолчанию, а затем исчезнет и сразу же снова появится в правильном («перемещенном») положении то есть вверху слева
- наконец, если я перейду на вкладку 1 любым способом, но затем вернусь на вкладку 2, коснувшись панели вкладок, подпредставление появится только в нижнем правом положении по умолчанию (не отражая предыдущий ход). я проверил, и строка кода в viewWillAppear в контроллере просмотра tab2 действительно работает, но мне кажется, что после этого может запускаться какой-то другой код, связанный с панелью вкладок, чтобы вернуть подпредставление в положение по умолчанию
любые идеи о том, что происходит и как я могу заставить новую позицию подвида придерживаться? а также как я могу остановить временное появление подвида в позиции по умолчанию, описанной в пункте 2 выше. любая помощь приветствуется
вот мой переход к другому коду вкладки
- (IBAction)nextTab:(id)sender {
NSInteger fromIndex = [self.tabBarController selectedIndex];
NSInteger toIndex = fromIndex + 1;
if (toIndex > self.tabBarController.viewControllers.count - 1) {
return;
} else {
//transition code
UIView *fromView = self.tabBarController.selectedViewController.view;//create the from view
UIView *toView = [[self.tabBarController.viewControllers objectAtIndex:toIndex] view];//create the to view
// Get the size of the view area.
CGRect viewSize = fromView.frame;
BOOL scrollRight = toIndex > fromIndex;
// Add the to view to the tab bar view.
[fromView.superview addSubview:toView];
// Position it off screen.
UIInterfaceOrientation orientation = self.interfaceOrientation;
if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) {
toView.frame = CGRectMake((scrollRight ? 768 : -768), viewSize.origin.y, 768, viewSize.size.height);
} else {
toView.frame = CGRectMake((scrollRight ? 1024 : -1024), viewSize.origin.y, 1024, viewSize.size.height);
}
[UIView animateWithDuration:0.3
animations: ^{
// Animate the views on and off the screen. This will appear to slide.
if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) {
fromView.frame =CGRectMake((scrollRight ? -768 : 768), viewSize.origin.y, 768, viewSize.size.height);
toView.frame =CGRectMake(0, viewSize.origin.y, 768, viewSize.size.height);
} else {
fromView.frame =CGRectMake((scrollRight ? -1024 : 1024), viewSize.origin.y, 1024, viewSize.size.height);
toView.frame =CGRectMake(0, viewSize.origin.y, 1024, viewSize.size.height);
}
// fromView.frame =CGRectMake((scrollRight? -768 : 768), viewSize.origin.y, 768, viewSize.size.height); // toView.frame =CGRectMake(0, viewSize.origin.y, 768, viewSize.size.height); }
completion:^(BOOL finished) {
if (finished) {
// Remove the old view from the tabbar view.
[fromView removeFromSuperview];
self.tabBarController.selectedIndex = toIndex;
}
}];
}
}
а вот мой код viewwillappear во 2-й вкладке
-(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];//call to super ow super will run its own code only?
//show the clock and then use ns timer to keep it updating
[self updateClock:nil];
[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(updateClock:) userInfo:nil repeats:YES];
//position the clock in custom spot if repositioned
self.clockView.center = self.clockViewCentre;
NSLog(@"x= %f",self.clockView.center.x);
}