切换tabbarcontroller中的选项卡,在通过gesturerecognizer滑动切换到仅点击选项卡时会产生不同的结果

时间:2014-03-25 22:08:30

标签: ios objective-c uiview tabbarcontroller

我有一个带有2个标签的tabbarcontroller。我设置了一个滑动手势识别器,允许用户在选项卡之间滑动,用户也可以点击选项卡转到该选项卡。

在第二个选项卡的viewcontroller中,我在主视图中有一个子视图。我已经使用平移手势识别器设置子视图,允许用户使用2个手指拖动来移动子视图。默认子视图位置是视图的右下角(来自故事板)。如果用户将子视图拖动到其他位置,如果用户滑动到第一个选项卡或只是点击标签栏上的第一个选项卡,我将在viewwilldisappear中保存子视图的中心点。当用户返回第二个选项卡时(通过从第一个选项卡视图滑动或通过点击tabbar上的第二个选项卡),我将子视图的中心设置为viewWillAppear中保存的centrepoint属性。

奇怪的是,如果我从右下方(即topleft)手动移动子视图位置,则会在更改标签上发生以下情况

  1. 如果我通过点击标签栏从tab2转到标签1,然后向左滑动返回标签2 - 子视图保持在正确的“移动”位置,即右上角

  2. 但是如果我通过向右滑动从tab2转到标签1,然后通过向左滑动返回到tab2 - 在消失之前,子视图会立即出现在默认的右下角位置并立即重新出现在正确的位置(“移动”)位置即左上角

  3. 最后,如果我通过任一方法转到标签1,但是然后通过点击标签栏返回标签2,则子视图仅显示在默认的右下角位置(不反映上一个移动)。香港专业教育学院检查并在tab2 viewcontroller中的viewWillAppear中的代码行似乎正在运行,但在我看来好像其他一些与tabbar相关的代码可能会在之后运行以将子视图放回默认位置
  4. 任何有关正在发生的事情的想法以及如何让子视图获得新的立场?以及如何阻止子视图暂时出现在上面第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代码

    -(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);
    

    }

1 个答案:

答案 0 :(得分:0)

在布局完成之前,

viewWillAppear被称为。因此,更改clockView中心的代码应该在viewDidLayoutSubviews