2013-09-24 8 views
20

私は昨年作成されたプロジェクトを持っており、XIB、ストーリーボードは使用していません。 XIBは自動レイアウトを使用しませんが、自動サイズ設定を使用します。私はすべてのビューがステータスバーの下に押し込まれているiOS7で動作しているときに問題があります。私は、これが期待できるiOS7の新機能だと十分に理解しています。しかし、これを行わないように修正するためのすべての解決策は機能していません。ステータスバーの下に常に表示されるビューの上部にイメージがあり、ナビゲーションバーやそのようなものは使用していません。iOS7 - ステータスバーの下に表示 - edgesForExtendedLayoutが機能しない

私はXIBのY-デルタを更新しようとしましたが(表示には何の影響もありません)、edgesForExtendedLayoutUIRectEdgeNone(何もしません)に設定しようとしました。私が何をしていても、状況バーは、ステータスバーのためのスペースを許すために手動でXIBのビューを下に移動しない限り、ステータスバーはその下に押し込まれたビューと共に表示されます(しかし、その解決策は機能しませんもちろん、iOS6では正しく表示されません)。奇数何

は、私はビューシフトにハックするコード行を試す場合でも、それは(次のように)動作しないということである:私は行くだろう

self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y+20, self.view.frame.size.width, self.view.frame.size.height); 

..Notそのようなソリューションはありますが、それはうまくいきません(私は通常、自動レイアウトが存在する場合は動作しないことがわかりますが、これはこの場合はありません)。

ステータスバーが表示される設計要件であり、iOS7のステータスバーの下に表示されないように設定することができません。私は、Appleの移行/ガイドだけでなく、件名に関するすべての単一のStack Overflow投稿を読んでいます。もう一度言いますと、私はそれがどのように機能し、どのような期待される解決策がこれにあるべきかを完全に理解していますが、この特定のプロジェクトではうまくいかないようです。

私は経験豊富なiOSデベロッパーですが、このプロジェクトは別のチームによって作成されていますので、上記の設定を破る可能性のあるXIBファイル、plist、またはコードのどこかに何かが隠されているかどうかはわかりません。これに目を通すことができる他のものがあるか、私が提供できる情報があれば教えてください。

ありがとうございます!

+0

ちょっとで「不透明バーの下に」uは任意の解決策を得るているオフにできますか?私は同じ問題に直面しています。 – Kalpesh

+0

解決方法はありますか? –

答えて

17

あなたがInterface BuilderでのiOS 6/7デルタ値を設定した場合、それはあなたが複製するのiOS 6のレイアウトであることから、Interface Builderのドキュメント上に「iOSの6」「のように表示」に設定することを忘れないでください。デルタは、ステータスバーの下にコンテンツをプッシュするためにiOS 7でのみ使用されます。 「表示形式」をiOS 7(デフォルト)に設定したままにすると、デルタはiOS 6でiOS 7の外観を表示します。

ただし、デルタは、プログラムに基づいてビューを再配置したりサイズを変更したりフレームはデルタを考慮していないので、ビューフレーム。

デルタを使用するのではなく、主なXIBで自動レイアウトを有効にして、トップレイアウトガイドの上部/コンテンツビューの上部スペース制約を設定することをお勧めします。このガイドはiOS 7で導入されたもので、ステータスバーの下の位置を表しています。残念ながら、Storyboardsを使用していない場合、Interface Builderではガイドは利用できませんが、プログラムで追加することはできます。

私がしたのは、Interface Builderでは代わりにsuperviewにトップスペース制約を追加し、コードのアウトレットを作成しました。次に、viewDidLoadでtopLayoutGuideが利用可能な場合(iOS 7+)、代わりにトップレイアウトガイドを使用してこのコンセントの制約をバージョンに置き換えます。

if ([self respondsToSelector:@selector(topLayoutGuide)]) { 
    [self.view removeConstraint:self.containerTopSpaceConstraint]; 

    self.containerTopSpaceConstraint = 
    [NSLayoutConstraint constraintWithItem:self.contentView 
           attribute:NSLayoutAttributeTop 
           relatedBy:NSLayoutRelationEqual 
            toItem:self.topLayoutGuide 
           attribute:NSLayoutAttributeBottom 
           multiplier:1 
            constant:0]; 

    [self.view addConstraint:self.containerTopSpaceConstraint]; 

    [self.view setNeedsUpdateConstraints]; 
    [self.view layoutIfNeeded]; 
} 
+0

これは、画面の上部にあるバーを下に動かす効果がありましたが、これはステータスバーの背景が灰色の背景ではなく白い背景になっています。 – ArtOfWarfare

+0

iOS 7では、ステータスバーの背景が透明です。 (ステータスバーの背後にある)トップビューの背景色を、ステータスバーに表示させる色に設定します。 –

+0

リセットself.view.frameが見つかりました。 THX! – frank

6

参考までに、以下のソリューションはViewControllerに適用したときに機能しました。しかし、それは理想的ではなく、ちょっとハッキリです。私が取ることができる唯一のアプローチだとしたら、そうでもあります。

float systemVersion=[[[UIDevice currentDevice] systemVersion] floatValue]; 
if(systemVersion>=7.0f) 
{ 
    CGRect tempRect; 
    for(UIView *sub in [[self view] subviews]) 
    { 
     tempRect = [sub frame]; 
     tempRect.origin.y += 20.0f; //Height of status bar 
     [sub setFrame:tempRect]; 
    } 
} 
+0

ちょっと私は上記のコードを使用しているが、このビューはナビゲーションバーの下に来て、ナビゲーションバーの上に来たいと思う。他の解決策があれば助けてください。 –

5

Appleは、これを達成するためにあなたにautolayoutを使用するように求めています。ビューの上部のサブビューから "Top Layout Guide"に制約を設定する必要があります。

は例のために、このドキュメントを参照してください。

https://developer.apple.com/library/ios/qa/qa1797/_index.html

XIBsせずにこれを行うには、プログラム的制約を追加する必要があります。 Appleのドキュメントはこれの良い例を示しています。私はこれを以下に要約しました。

topLayoutGuideがビューコントローラ上のプロパティであることを前提とすると、変数バインディングの辞書でそれを使用するだけです。次に、通常のように制約を設定します。

id topGuide = [myViewController topLayoutGuide]; 
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(button, topGuide); 
NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[topGuide]-20-[button]" options:0 metrics:nil views:viewsDictionary]; 

このドキュメントはin the UIViewController class referenceです。

+1

XIBを使用している場合は、ストーリーボードを使用している場合に限り、Interface Builderからトップレイアウトガイドに制約を設定することはできません。ですから、この制約をプログラムでどのように作成するのですか? –

+0

@PhillApleyプログラミングによる方法については、私の編集した回答を参照してください。 – petehare

+0

私はあなたがどのようにUITableViewで制約を使用するのかわかりません。 – shul

3

1)あなたは、不透明なナビゲーションバーを持つ気にしない場合は、最も簡単な解決策:

self.navigationController.navigationBar.translucent = NO; 

2)svguerin3の答えは、一般的なケースで作業することはできません。たとえば、サブビューの1つが自動サイズ設定を使用してコンテナの下部に引っ掛かっている場合、その新しい位置は間違っています。最悪の場合、画面外に出る可能性があります。

+0

試してみました。うまくいきませんでした。これはおそらく私が今までに受けた中で最も厄介な問題です。 – ArtOfWarfare

2
- (void)viewDidAppear:(BOOL)animated { 
     [self.view setFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height)]; 
// OR 
     self.view.transform = CGAffineTransformMakeTranslation(0, 20); 
} 
0

XIBをソースとして表示し、edgesforextendedlayoutを含む行を削除しようとしましたか?私たちのために起こっていた私たちは、ストーリーボードの場面メインビューはXIBs

で表現されているので、私たちのストーリーボードの場面でこの行を削除する必要がありました

はその何とか、いくつかのシーンでは、用XIBの内容でしたシーンのメインビューがステータスバーとナビゲーションバーの高さによってプッシュダウンされていました。

この行を削除すると、XIBがストーリーボードのシーンの同じ上部にあるかのようにXIBが表示されるようになりました。

悲しいことに、私たちは何を引き起こしたのか分かりませんが、UITextViewが最初に現れるように、XIBのメインビュー内のコンテンツの順序を変更すると起こることがわかりました。これが引き起こされた後にアイテムの順序を並べ替えることは、この望ましくない動作を取り除くことには効果がありませんでした。

これは、このタイプの問題に遭遇している人に役立ちます。

0

あなたのビューの上部レイアウトを設定した後、ストーリーボードを使用している場合は、属性インスペクター

Storyboard

関連する問題