0

私はこれに関して多くの問題を抱えています。UINavigationBar woes

  1. ビルトインUINavigationController nudges(私は手動バックアップの位置を微調整する必要がある)私のUIViewControllersの残りダウンの位置からまず第一に、UINavigationBar。私はstackoverflowを検索し、現在のナビゲーションバーを隠し、インターフェイスビルダにUINavigationBarを手動で追加するように提案しています。これは私に2番目の問題をもたらします。
  2. IBからUINavigationBarを手動で追加すると、ナビゲーションが「切断」になります。たとえば、ビューコントローラをポップするためにバックボタンを手動で実装する必要があります。これは私の3番目の問題に私をもたらします:
  3. 私が与えられた仕様は、戻るボタン(ボタンの左側が三角形のように傾いている)の形をした戻るボタンを必要としていると述べました。残念なことに私はどこからでも検索してきました。誰もが、手作業でイメージを追加して戻るボタンのように見せなければならないと言っています。しかし、私の後ろのボタンのタイトルがイメージよりも長い場合はどうしたらいいですか?私は各タイトルのイメージを作らなければならないでしょう!

これら3つの問題の解決策は、非常に役立ちます。

+1

なぜナビゲート可能なVCのコンテンツをナビゲーションバーでナッジダウンしたくないのですか?それ以外の場合は、コンテンツがナビゲーションコントローラのナビゲーションバーの下にあることを意味します。 – Eimantas

+0

私に与えられた資産はフルスクリーンの背景を念頭に置いて切り取られました。私は手動で画像自体を切り捨てるか、上に移動するためにコードの各画面の位置を微調整する必要があります。私は、ナビゲーションバーの下にコンテンツが欲しいです。 – ninjaneer

答えて

1

第1の問題:私は415ピクセルの親ビューを使用します。これは、45(460-415)がナビゲーションバーによって取得されるためです。私が415から始まって以来、軽く振る舞う必要はありません。

2番目と3番目:本当にありません。テキストを描画する場所にストレッチング可能なイメージを使用できます。このレシピでは、左右のボタンと中間の1ピクセルが必要です(中央のテキストの左側+右側+長さ)。

例:12 + 1 +(文字サイズ)+ 5画素

left button

と左ボタンは、この操作を行います。私は、システムフォントを使用してい

/** 
* Return the given image with white text written in the middle. 
* 
* The image should be stretchable. 
* The text is written with bold system font 12. 
* 
* @param btnLeft The original image. 
* @param capWidth The capWidth to stretch it. 
* @param text  The text to draw in the image. 
* @return A image containing the original stretched image with some text written in the middle. 
*/ 
+(UIImage*) drawText:(NSString*)text inImage:(UIImage*)image capWidth:(int)capWidth { 

    if (image==nil) { 
     return nil; 
    } 

    // make it stretchable 
    UIImage *stretchable = [image stretchableImageWithLeftCapWidth: capWidth 
                 topCapHeight: 0]; 

    UIFont *font = [UIFont boldSystemFontOfSize:12]; 

    // the combined size is that of the image plus the text 

    CGSize textSize = [text sizeWithFont:font]; 
    CGSize combinedSize = CGSizeMake(image.size.width + textSize.width, image.size.height); // should be +4 for more breath 

    UIGraphicsBeginImageContext(combinedSize); 

    // draw the image 
    [stretchable drawInRect:CGRectMake(0,0,combinedSize.width,combinedSize.height)]; 

    // draw the text 
    float y = (image.size.height-textSize.height)/2; // leaves even distance to top and bottom 
    CGRect rect = CGRectMake(capWidth, y, textSize.width,textSize.height); // should be +2 for more breath space 
    [[UIColor whiteColor] set]; 
    [text drawInRect:CGRectIntegral(rect) // positioning on a fractional point produces blurry text 
      withFont:font]; 

    // gets the result 
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return newImage; 
} 

注、別のものが必要な場合は、別のパラメータを追加します。コントローラのviewLoadに次のコードを追加します。

// buttonLeft is the button UIImage 
UIButton *back = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *image = [ImageUtils drawText:@"Back" inImage:buttonLeft capWidth:14];  
[back setBackgroundImage:image forState:UIControlStateNormal]; 
[back addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; 
back.frame = CGRectMake(0, 0, image.size.width, image.size.height); 
UIBarButtonItem *backbi = [[[UIBarButtonItem alloc] initWithCustomView:back] autorelease]; 
self.navigationItem.leftBarButtonItem = backbi; 

このコードではどのようなことが達成できますか?ローカライズされた文字列で動作する完璧なサイズのボタンで、サポートされている言語ごとに2倍のPNG(標準+網膜)を生成することを防ぎます。これは、UIKitがタイトル付きのボタンをペイントするために使用するCore Graphicsコードと似ていますので、UIが遅くなることはありません。

+0

私はこれを打ち明けて報告します。ありがとう! – ninjaneer

+0

これは私のために働く! – ninjaneer

0

これは問題のカスケードです。しかし、私は簡単な答えを持っています。

UIViewControllerのちょっとしたプロパティがあります。これはwantsFullScreenLayoutと呼ばれています。ナビゲーションスタックに追加するすべてのView Controllerに対してYESに設定し、ナビゲーションバーがあることを無視します。それに応じてサブビューのフレームを設定することを忘れないでください。

これは、最初の問題を修正します。その後の解決策は、あなたに自然に来るはずです。

+0

それは動作していないようです。私は自分のUIViewControllerのviewDidLoadにself.wantsFullScreenLayout = YESを置き、何も変わりません。 – ninjaneer

+0

実際には、デフォルトで 'wantsFullScreenLayout'はナビゲーションバーに関して何もしません。なぜなら、どのビューも既にそれらをオーバーラップさせているからです。私はステータスバーの下にスペースが必要なときにこのプロパティを使用します(私はビューの完全なフルスクリーンレイアウトを取得します)。あなたはナビゲーションバーから何らかの奇妙な行動を経験しています(起こりがちなIBの使用時)。私はこのプロパティが問題を解決することを望んでいた。ウィンドウのフレームを設定して、ナビゲーションコントローラを追加する方法はありますか? – MiguelB

1

XIBでは、実際のレイアウトを表示するには、UIViewのナビゲーションバースタイルとステータスバースタイル(UiViewController.xib内)を設定する必要があります。

ナビゲーションバーを消したい場合は、ウィンドウにウインドウを追加するときに、UINavigationControllerビューのフレームを調整することができます。ここでは、UINavigationControllerスタックの下の各UIViewControllerの下位部分を処理する必要があります。