9

編集:ジョンは彼の答えに多大な努力を払い、とにかくそれを手に入れるので、ジョンに賞金を授与しましたが、まだ有効な解決策はありません. 誰かがこれを行う方法を知っていれば、私はまだ答えを探しています。

ナビゲーションとタブ バーを非表示にする「最大化」ボタンをアプリに追加したいと考えています。navbar と tabbar はスムーズにスライドイン/スライドアウトする必要があり、内部/コンテンツ ビューも navbar と tabbar と同じ速度で拡大および縮小する必要があります。

私はナビゲーションバーに使用[self.navigationController setNavigationBarHidden: YES/NO animated: YES];し、このスレッドを見つけましたタブバーを非表示にするためのuitabbarcontroller を非表示にする方法

UITabBar クラス拡張:

- (void) setTabBarHidden:(BOOL)hidden animated:(BOOL)animated {
    CGRect screenRect = [[UIScreen mainScreen] bounds];

    float screenHeight = screenRect.size.height;
    if (UIDeviceOrientationIsLandscape([UIDevice currentDevice].orientation)) {
        screenHeight = screenRect.size.width;
    }
    if (!hidden) {
        screenHeight -= self.tabBar.frame.size.height;
    }
    [UIView animateWithDuration: (animated ? UINavigationControllerHideShowBarDuration : 0) animations: ^{
        for (UIView* each in self.view.subviews) {
            if (each == self.tabBar) {
                [each setFrame: CGRectMake(each.frame.origin.x, screenHeight, each.frame.size.width, each.frame.size.height)];
            } else {
                [each setFrame: CGRectMake(each.frame.origin.x, each.frame.origin.y, each.frame.size.width, screenHeight)];
            }
        }
    } completion: ^(BOOL finished) {
        NSLog(@"Animation finished %d", finished);
    }];
}

問題は、2つを同時に使用すると(ナビゲーションとタブバーを非表示/表示)、きれいではないことです。ナビゲーション バーが最初に来ると、一番下に固定されているものはすべてジャンプし (以下の例を参照)、タブバーが最初に来ると、一番上にジャンプします。

例: UIButton を右下に配置し、その自動サイズ変更マスクを設定します

resizeButton.frame = CGRectMake(self.view.bounds.size.width - 50, self.view.bounds.size.height - 100, 32, 32); // hardcoded just for testing purposes
resizeButton.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleTopMargin;

ただし、navbar と tabbar が最小化されると、UIButton は 2 つの状態の間をジャンプします (タブ バーと一緒にスライドしません)。しかし、右上に取り付けるように変更すると、ナビバーと完全にスライドします。

これを解決する方法を知っている人はいますか?


編集:これは私がこれまでに持っていたクローゼットで最もエレガントなソリューションです(機能するコンセプトを取得しようとしているだけです):

[UIView animateWithDuration: UINavigationControllerHideShowBarDuration animations: ^{
    if (self.isMaximized) {
        self.tabBarController.view.frame = CGRectMake(0, 20, screenRect.size.width, screenRect.size.height + 49 - 20);
        [self.navigationController setNavigationBarHidden:YES animated:YES];
    } else {
        self.tabBarController.view.frame = CGRectMake(0, 20, screenRect.size.width, screenRect.size.height - 20);
        [self.navigationController setNavigationBarHidden:NO animated:YES];
    }
} completion: ^(BOOL finished) {
    NSLog(@"Frame done: %@", NSStringFromCGRect(self.view.frame));
    return;
}];

最大化時:

  • ナビゲーションバーを上にスライドさせ、同時にタブバーを下にスライドさせます
  • 内部/コンテンツ ビューの上部がスライド アップし、このビューの下部がジャンプ ダウンします

最小化について:

  • ナビゲーションバーを下にスライドさせ、同時にタブバーを上にスライドさせます
  • 内側/コンテンツ ビューの上部は適切に下にスライドしますが、下部は最終値にジャンプし、スライドするタブバーによって覆われる空白が残ります。

最小化アニメーションの順序を並べ替えると (ナビゲーション バーのアニメーションが最初に呼び出されるように)、内部/コンテンツ ビューの上部がジャンプします。

4

3 に答える 3

-1

動作している場合は、このコードを試してください。私はこのコードを1年前に書いています。しかし、それでも私にとってはうまくいきます。

ブロックベースのアニメーションは使用しませんでした。私がiOSを始めたばかりのときに書いたものだからです。必要に応じて自分自身を最適化してみてください。

- (void) hideTabBar:(UITabBarController *) tabbarcontroller {

    [self.navigationController setNavigationBarHidden:YES animated:YES];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.1];
    for(UIView *view in tabbarcontroller.view.subviews)
    {
        if ([[UIDevice currentDevice]userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
            if([view isKindOfClass:[UITabBar class]])
            {
                [view setFrame:CGRectMake(view.frame.origin.x, 480, view.frame.size.width, view.frame.size.height)];
            } 
            else 
            {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 480)];
            }            
        }else if([[UIDevice currentDevice]userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
            if([view isKindOfClass:[UITabBar class]])
            {
                [view setFrame:CGRectMake(view.frame.origin.x, 1024, view.frame.size.width, view.frame.size.height)];
            } 
            else
            {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 1024)];
            }
        }
    }
    [UIView commitAnimations];
}

// Method shows the bottom and top bars

- (void) showTabBar:(UITabBarController *) tabbarcontroller {

    [self.navigationController setNavigationBarHidden:NO animated:YES];
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.1];
    for(UIView *view in tabbarcontroller.view.subviews)
    {
        if ([[UIDevice currentDevice]userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
            if([view isKindOfClass:[UITabBar class]])
            {
                [view setFrame:CGRectMake(view.frame.origin.x, 430, view.frame.size.width, view.frame.size.height)];
            } 
            else 
            {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 436)];
            }            
        }else if([[UIDevice currentDevice]userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
            if([view isKindOfClass:[UITabBar class]])
            {
                [view setFrame:CGRectMake(view.frame.origin.x, 975, view.frame.size.width, view.frame.size.height)];
            } 
            else 
            {
                [view setFrame:CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width, 980)];
            }
        }
    }
    [UIView commitAnimations]; 
}
于 2013-06-20T06:59:36.123 に答える
-2

これを試して

次のようなアニメーションを使用して、タブバーコントローラーとナビゲーションバーを非表示にすることができます:-

-(IBAction)hide:(id)sender
{
[self hideShowBars];
}
- (void) hideShowBars
{
   CGRect rect = self.navigationController.navigationBar.frame;
   CGRect rect1 = self.tabBarController.tabBar.frame;

   if(self.navigationController.navigationBar.isHidden)
    {
      [self.navigationController.navigationBar setHidden:NO];
      rect.origin.y=self.view.frame.origin.y;
    }
   else
   {
      rect.origin.y=self.view.frame.origin.y-rect.size.height;
   }

   if(self.tabBarController.tabBar.isHidden)
   {
      [self.tabBarController.tabBar setHidden:NO];
      rect1.origin.y=self.view.frame.size.height-rect1.size.height-rect1.size.height;
   }
   else
   {
      rect1.origin.y=self.view.frame.size.height;
   }
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.50];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(hideShowBarsAnimationStopped)];

self.navigationController.navigationBar.frame=rect;
self.tabBarController.tabBar.frame = rect1;
[UIView commitAnimations];
 }
- (void) hideShowBarsAnimationStopped
{
if(self.navigationController.navigationBar.frame.origin.y==self.view.frame.origin.y)
    return;

if(!self.navigationController.navigationBar.isHidden)
{
    [self.navigationController.navigationBar setHidden:YES];
}

if(!self.tabBarController.tabBar.isHidden)
{
    [self.tabBarController.tabBar setHidden:YES];
}
}
于 2013-06-14T07:03:38.717 に答える