2012-03-06 9 views
0

現在iPhoneアプリケーションのnavigationBarに画像を表示するためにdrawRectメソッドを使用していますが、このメソッドをiPadに使用したくない汎用アプリケーションを作成しています。iPadのdrawRectメソッドを避ける

UINavigationBarを変更するカテゴリを作成しました。そこで私は以下のことをしました。

if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
    { 
     // iPad mode ... dont load anything 
    } 
    else 
    { 
     // iphone mode .... use an image 
    } 

この後、iPadのナビゲーションバーではなく黒い空白が表示されます。 iPhoneではうまく動作します。

私はself.navigationController.navigationBar.barStyle = UIBarStyleDefaultを使用して試しました。私の両方のMatser & viewDidLoadの詳細ビューはまだ黒い空白を表示します。

デバイスがiPadの場合、drawRectメソッドの呼び出しを避けるにはどうすればよいですか。

おかげ

答えて

1

あなたがUINavigationBarをサブクラス化していた場合、あなただけの各プラットフォーム上で右ナビゲーションバークラスを使用する必要があります。つまり、インターフェースイディオムチェックは、drawRect:の実装ではなく、ナビゲーションバーの作成に影響します。

drawRect:の実装(これを行うべきではない)を置き換えるカテゴリを使用しているので、私はあなたの唯一の選択肢は動的メソッドのスウィズルです。つまり、iPhone/iPod TouchでのみdrawRect:を置き換えます。

UINavigationBarをサブクラス化する方が、より簡単で、安全で、きれいであると考えてください。それは互換性の頭痛を避けるのに役立ちます。

EDIT:例として、カスタムUINavigationBarサブクラスの空のナビゲーションコントローラのみを含むnibファイルがあるとします。これを行うには、xibエディタでナビゲーションバーを選択し、インスペクタでそのクラスを変更します。

UINavigationController *navigationController = nil; 

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) 
    navigationController = [[UINavigationController alloc] init]; 
else { 
    UINib *nib = [UINib nibWithNibName: @"MyNavigationController" bundle: nil]; 
    navigationController = [[[nib instantiateWithOwner: nil options: nil] objectAtIndex: 0] retain]; 
} 

iPhoneまたはiPod Touchで実行すると、このコードはnibファイルからナビゲーションコントローラを作成します。

+0

iPhone/iPod touchでdrawRectを呼び出すにはどうすればよいですか? – JiteshW

+0

@ J61答えを編集して必要なコードを追加しました。 – Costique

0

メソッドの冒頭で[super drawRect]を呼び出すと、デフォルトの実装が呼び出され、UINavigationBarが正常に描画されます。

カスタムサブクラスを実行すべきではない理由は、UINavigationControllerUINavigationBarを直接インスタンス化し、サブクラスを使用するように指定できないためです。

+0

iPad用に[super drawRect]を呼び出そうとしましたが、まだ黒いバーが表示されていました。 – JiteshW

関連する問題