5

以下のスクリーンショットに表示されているマージンがどこから来ているのか、誰かに説明してもらえますか?赤、緑、青の長方形を、横向きと縦向きの両方の画面レイアウトで並べて配置したいと思います。代わりに、ビュー間に不可解なマージンが表示されます。

// Setup Left Bar Button item
UIBlankToolbar* tools = [[[UIBlankToolbar alloc] initWithFrame:CGRectMake(0, 0, 115, 44)] autorelease];
tools.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[tools setBackgroundColor:[UIColor greenColor]];
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:tools] autorelease];

...

// Setup Right Bar Button Item
UIBlankToolbar* tools = [[[UIBlankToolbar alloc] initWithFrame:CGRectMake(0, 0, 100, 44)] autorelease];
[tools setAutoresizingMask:UIViewAutoresizingFlexibleWidth];
[tools setBackgroundColor:[UIColor redColor]];
self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:tools] autorelease];

...

// Setup Title View
self.navigationItem.titleView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 50, 44)] autorelease];
self.navigationItem.titleView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[self.navigationItem.titleView setBackgroundColor:[UIColor blueColor]];

このコードで私が見るもの:

ここに画像の説明を入力してください ここに画像の説明を入力してください

私が本当に困惑しているのは、使用可能なスペースが小さくなるにつれて、ビュー間のマージンが大きくなることです。なぜ彼らがそこにいるのか、なぜ彼らがマージンから期待するものに反して振る舞うのか理解できません。

ありがとう!

4

1 に答える 1

4

ナビゲーションバーには、それが適用するアイテム間の最小マージンがあり、それがマージンを取り除くことができない理由です。

特定のコードを説明することもそれほど難しくありません。115+100+50 = 265画面の幅は320であるため、ナビゲーションバーにはマージンとして使用する55ピクセルがあります。左のアイテムは左揃え、右のアイテムは右揃え、中央のアイテムは中央に配置されます。したがって、ポートレートで得られるマージンは完全に理にかなっています。

横向きに見えるのは、幅が柔軟なためです。ナビゲーションバーのアイテムに柔軟な幅を設定することは想定されていないため、その際の動作は定義されていません。つまり、バグはナビゲーションバー自体ではなく、ナビゲーションバーの使用方法にあります。

何が起こっているのかというと、正しいアイテムの新しいサイズが最初に計算されます。100からに成長し100+(480-320) = 260ます。次に、中央のアイテムのサイズが計算され、使用可能なすべてのサイズが使用されているように見えます。左側のアイテムを計算するときは、右側と中央のアイテムがすべてのスペースを占めているため、実際には縮小します。したがって、ナビゲーションバーがマージンを適用すると、ピクセルは左側のアイテムから取得されます。

実際のアルゴリズムは異なる場合があります。結局のところ、それはクローズドソースであり、未定義の動作を説明しようとしていますが、何が起こっているのかと思われる生成されたマージンを調べています。

とにかく、未定義の動作はバージョン間で変更されて破損する可能性があるため、アプリは未定義の動作に依存しないでください。独自のカスタムビューを作成し、ナビゲーションバーのサブビューとして追加する必要があります。次に、ビュー内のマージンを希望どおりに処理します。

yourView = [[YourView alloc] initWithFrame:(UIInterfaceOrientationIsPortrait(interfaceOrientation)) ? CGRectMake(0, 0, 320, 44) : CGRectMake(0, 0, 480, 44)];
yourView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
[self.navigationController.navigationBar addSubview:yourView];
于 2011-05-29T14:55:04.983 に答える