編集:ジョンは彼の答えに多大な努力を払い、とにかくそれを手に入れるので、ジョンに賞金を授与しましたが、まだ有効な解決策はありません. 誰かがこれを行う方法を知っていれば、私はまだ答えを探しています。
ナビゲーションとタブ バーを非表示にする「最大化」ボタンをアプリに追加したいと考えています。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;
}];
最大化時:
- ナビゲーションバーを上にスライドさせ、同時にタブバーを下にスライドさせます
- 内部/コンテンツ ビューの上部がスライド アップし、このビューの下部がジャンプ ダウンします
最小化について:
- ナビゲーションバーを下にスライドさせ、同時にタブバーを上にスライドさせます
- 内側/コンテンツ ビューの上部は適切に下にスライドしますが、下部は最終値にジャンプし、スライドするタブバーによって覆われる空白が残ります。
最小化アニメーションの順序を並べ替えると (ナビゲーション バーのアニメーションが最初に呼び出されるように)、内部/コンテンツ ビューの上部がジャンプします。