32

メニュー付きのiPhoneアプリケーションがありUITableViewます。テーブル内の行が選択されると、適切なビュー コントローラーがアプリケーションのUINavigationControllerスタックにプッシュされます。

私の問題はMenuViewController、ツールバーは必要ありませんがUIViewControllers、スタックにプッシュされたものは必要です。UIViewControllerプッシュされた呼び出しを取得setToolbarHidden:animated:するそれぞれviewDidAppear:。ツールバーを非表示にするために、 を呼び出しsetToolbarHidden:animated:ますviewWillDisappear:

ツールバーを表示すると、プッシュされたビューが表示されたときにツールバーが上にスライドし、ビューのサイズが正しく変更されます。ただし、戻るボタンを押すと、ツールバーは下にスライドしますが、ビューのサイズは変更されません。これは、他のビューが遷移するときに、ビューの下部に沿って黒いストリップがあることを意味します。ツールバーを非表示にする前に、ツールバーの高さをビューの高さに追加しようとしましたが、これにより、まだ黒いバーがあるように移行します。

独自の UIToolbar を管理できることはわかっていますが、便利な組み込みの UIToolbar を使用したいと考えていUINavigationControllersます。

このフォーラムの投稿でも同じ問題について言及されていますが、回避策については言及されていません。

4

11 に答える 11

24

私もこの問題を経験しました。私の場合、ウィンドウの背景を表示せずにツールバーを正常に非表示にする唯一の方法は[self.navigationController setToolbarHidden:YES animated:animated]、View Controller の-viewDidAppear:メソッドを呼び出すことです。

于 2010-04-30T18:39:16.283 に答える
6

プッシュ時にツールバーを必要としない UIViewController の場合、次のいずれかを使用することを検討できます

その UIViewController の hidesBottomBarWhenPushed メソッドを実装します。

// method to be added to the UIViewController that has no toolbar
- (BOOL) hidesBottomBarWhenPushed {
    return YES;
}

または、UIViewController をプッシュする前に、hidesBottomBarWhenPushed の値を設定します。

viewControllerWithNoToolBar.hidesBottomBarWhenPushed = YES
[self.navigationController pushViewController:viewControllerWithNoToolBar animated:YES];
于 2013-02-10T09:58:11.583 に答える
6

私はこの質問に対する答えに満足していなかったので、私は自分自身を投稿しました: Reference to source View Controller and destination View Controller at the same time

私が得た答えは私の問題を解決しました。あなたにも当てはまるかもしれません(この質問はかなり古いですが、ヒントを探してこの投稿を半ダース回読んだ私のような人に役立つかもしれないと思いました)。

これが私がしたことです。マーカー プロトコルが慣用的な Objective-C であるかどうかはわかりませんが、C# で使用するような属性に例えると、次のマーカー プロトコルがあります。

@protocol HidesNavigationItem
@end

UINavigationControllerDelegate を AppDelegate に追加しました。それが良いことなのかどうかはまだわかりません。その実装を別のオブジェクトに保持することも考えましたが、今のところ、ここに配置します。実装は次のとおりです。

#pragma mark Navigation Controller Delegate
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [navigationController setNavigationBarHidden:[viewController conformsToProtocol:@protocol(HidesNavigationItem)] animated:animated];
}

このようにして、次のように UIViewController 実装にマーカー プロトコルを設定するだけです。

@interface MyViewController : UIViewController <HidesNavigationItem>

そのインターフェイスがない場合は、元に戻します。

最後に、appDelegate の application:didFinishLaunchingWithOptions: メソッドで、デリゲートを次のように接続します。

if ([self.window.rootViewController isMemberOfClass:[UINavigationController class]])
    ((UINavigationController*)self.window.rootViewController).delegate = self;

今では、ブラック ボックスもチェシャ キャットもありません。もちろん、私の解決策はナビゲーションバーに関するものでしたが、ツールバーでも同じように機能すると確信しています。これは、「animated:animated」なしでブラック ボックスを取得することを除いて、Danra の回答と非常によく似ています。

于 2012-01-24T20:23:35.863 に答える
1

新しいViewControllerにツールバーを表示するには、次を追加します。

- (void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setToolbarHidden:NO animated:animated];
    [super viewWillAppear:animated];
}

ツールバーを非表示にするには:

- (void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setToolbarHidden:YES animated:animated];
    [super viewWillAppear:animated];
}

画面間を移動するときは、次のコードで新しいViewControllerをプッシュします。

SettingsRecordingViewController *vc = [[SettingsRecordingViewController alloc] initWithNibName:@"SettingsRecordingViewController" bundle:[NSBundle mainBundle]]; 
[self.navigationController pushViewController:vc animated:YES];      
[vc release];

ツールバーの状態が異なる場合(非表示/表示)、ツールバーの非表示/表示のアニメーションが表示されます。

于 2011-04-13T19:43:35.017 に答える
1

UINavigationControllerDelegate を実装して、ナビゲーション コントローラーのデリゲート プロパティに設定してみてください。これは、目に見えるアーティファクトなしで、投稿で説明していることを達成しました。

次のコードは、firstController で実行されるアクションによって secondController がナビゲーション ビューにプッシュされることを前提としています。

MyNavigationControllerDelegate.h

@interface MyNavigationControllerDelegate : NSObject<UINavigationControllerDelegate> {
}

-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;

@end

MyNavigationControllerDelegate.m

#import "MyNavigationControllerDelegate.h"
#import "AppDelegate_Shared.h"

@implementation MyNavigationControllerDelegate

-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if ([AppDelegate_Shared sharedDelegate].firstController  == viewController ) {
        [navigationController setNavigationBarHidden:TRUE];
        [navigationController setToolbarHidden:FALSE];
    }
}

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if ([AppDelegate_Shared sharedDelegate].secondController == viewController ) {
        [navigationController setNavigationBarHidden:FALSE];
        [navigationController setToolbarHidden:TRUE];
    }
}

@end

sharedDelegate は単なるヘルパー メソッドです。

AppDelegate_Shared.m

+ (AppDelegate_Shared*)sharedDelegate {
    return (AppDelegate_Shared*)[[UIApplication sharedApplication] delegate];
}
于 2010-10-13T07:48:10.613 に答える
1

ここでの問題は、UITableViewのフレームが と重ならないように設定されていることUIToolbarです。つまり、 のすぐ上にありUIToolbarます。スタックの次UIViewControllerをプッシュすると、 を削除しているときに、その場所に何かを置かない限り、その後ろ以外に何も表示されません。UINavigationControllerUIToolbarUIWindow

トランジション後の厄介なアニメーションを回避する 1 つの回避策は、通常のビューと同じフレームを共有UITableViewする「コンテナ」に配置することですが、トランジション中に表示したい色 (白など) の下に重なります。 UIViewUIToolbar

アンダーラップを実行するには、 を に設定できUIViewControllerますwantsFullScreenLayout = YESUITableView次に、コンテナを使用する前と同じフレームを持っていることを確認します。つまり、ナビゲーション バーの下、ツールバーの上にあります。

これは、カスタムUIViewControllerを作成して の代わりに使用するか、こっそりと既存の の下に新しい「コンテナ」UITableViewControllerを挿入することで、より洗練されたものにすることができます。UIViewUITableViewUITableViewController

于 2012-01-18T17:10:51.893 に答える
0

ツールバーの背景にはカスタムの背景画像を使用し、テーブルの背景にはカスタムの画像を使用します。ビューが別のテーブルビューから前後に遷移するため、下部の黒いバーで同じ問題が発生していました。しかし、私は

self.navigationController.toolbar.barStyle = UIBarStyleBlackTranslucent;

ビューでDidLoad。

これにより、背景イメージが背景の潜在的な最大サイズに設定されます。これは、透明なツールバーがある場合に意味があります。標準の不透明なツールバーを使用している場合は、おそらく適切な回避策ではありませんが、ツールバーをカスタマイズする場合は、両方の長所を活かすことができます。

于 2012-06-30T01:20:52.747 に答える
0

I am in agreement with Jeff's answer. But there is a UI glitch if I hide the toolbar in -viewDidAppear method of the viewController through which different viewControllers are pushed.

To avoid this, I was experimenting and found out that calling -setToolbarHidden in the -viewWillAppear call indeed hides the toolbar, but as the question states, the view though expanded would not be occupied by the tableview rows.

To fix this, I have changed to following code and now it works without the glitch:

- (void)viewDidLoad
{
    [super viewDidLoad];
.
.
.
    [self reframeRowHeight];
    [self.menuItemTableView addObserver:self
                             forKeyPath:@"frame"
                                options:NSKeyValueObservingOptionNew
                                context:nil];
    [self.menuItemTableView setBounces:NO];
.
.
.
}
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"frame"])
    {
        [self reframeRowHeight];
    }
}

-(void)reframeRowHeight
{

    [self.menuItemTableView setRowHeight:self.menuItemTableView.frame.size.height/self.menuItems.count];
    [self.menuItemTableView reloadData];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
.
.
.
    // Bad Apple! - http://stackoverflow.com/questions/2339721/hiding-a-uinavigationcontrollers-uitoolbar-during-viewwilldisappear
    [self.navigationController setToolbarHidden:YES animated:YES];
.
.
.
}
于 2013-02-25T09:05:19.237 に答える
-3

私は同じ問題を抱えていましたが、これが私のために働いた解決策です。SomeUIViewControllerナビゲーション スタックにプッシュしているとします。

のインターフェイスでこの (プライベート) ivar を定義しますSomeUIViewController

// keep a reference to the navigation controller for use in viewDidDisappear:(BOOL)animated method
UINavigationController * _navigationController; 

の次のメソッドを実装しますSomeUIViewController

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    // here, your controller still has a reference to self.navigationController
    _navigationController = [self.navigationController retain];
}

- (void)viewDidDisappear:(BOOL)animated {
    // at this point, self.navigationController = 0x0, so
    // use your retained reference to the navigation controller to perform any last minute operations, then release

    [_navigationController setToolbarHidden:YES];
    [_navigationController release];

    [super viewDidDisappear:animated];
}

アイデアは、のビューが消えた 、ナビゲーション コントローラーが所有するツールバーを非表示にすることです。SomeUIViewControllerこれにより、不要な表示アーティファクトを回避できます。

免責事項

これは、記載された質問に対する回避策を示す単なる回答です。フレームワークの内部動作の詳細を指摘することのみを目的としています。これは、Apple AppStore に提出してはいけないものの例としても意味されています。

于 2010-05-26T14:28:37.707 に答える