Переключение вкладок в tabbarcontroller дает разные результаты при переключении с помощью жестового распознавателя.

у меня есть tabbarcontroller с 2 вкладками. Я настроил распознаватель жестов смахивания, чтобы пользователи могли перемещаться между вкладками, и пользователи также могут просто нажать на вкладку, чтобы перейти на эту вкладку.

в контроллере представления 2-й вкладки у меня есть подвид в основном представлении. Я настроил подвид с помощью распознавателя жестов панорамирования, который позволяет пользователям перемещать подвид с помощью перетаскивания двумя пальцами. позиция подпредставления по умолчанию — правый нижний угол представления (из раскадровки). если пользователи перетаскивают подпредставление в другое место, я сохраняю центральную точку подпредставления в представлении, которое исчезнет, ​​если пользователи проведут пальцем по первой вкладке или просто коснутся первой вкладки на панели вкладок. когда пользователи возвращаются на 2-ю вкладку (через пролистывание с первой вкладки или нажатием 2-й вкладки на панели вкладок), я устанавливаю центр подпредставления в сохраненное свойство центральной точки в viewWillAppear.

странно, если я вручную перемещаю положение подвида снизу справа (скажем, сверху слева), при смене табуляции происходит следующее

  1. если я перейду с вкладки 2 на вкладку 1, нажав на панель вкладок, а затем вернусь на вкладку 2, проведя пальцем влево - подпредставление останется в правильном «перемещенном» положении, то есть вверху справа.

  2. но если я перейду с вкладки 2 на вкладку 1, проведя пальцем вправо, а затем вернусь к вкладке 2, проведя пальцем влево - подвид сначала на мгновение появится в нижнем правом положении по умолчанию, а затем исчезнет и сразу же снова появится в правильном («перемещенном») положении то есть вверху слева

  3. наконец, если я перейду на вкладку 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);

}


person lozflan    schedule 25.03.2014    source источник


Ответы (1)


viewWillAppear вызывается до завершения макета. Таким образом, код, который меняет центр clockView, должен быть в viewDidLayoutSubviews.

person user3386109    schedule 25.03.2014
comment
да, спасибо, кажется, все исправили отлично. есть ли быстрый простой способ увидеть списки порядка вызовов методов для таких вещей, как это, то есть представления, контроллеры вкладок, контроллеры представлений .... или это просто вопрос чтения руководств Apple и опыта. - person lozflan; 26.03.2014
comment
В основном яблочные гиды и опыт. Я поместил NSLog( @"%s", __func__ ) во все методы viewWill... и viewDid... контроллера представления, чтобы увидеть, каков порядок :) - person user3386109; 26.03.2014