の中にあるViewController
がありますUINavigationcontroller
が、navigationBarは非表示になっています。iOS 7でアプリを実行すると、ステータスバーがビューの上に表示されます。これを回避する方法はありますか?
OS固有のコードを書きたくありません。
に設定View controller-based status bar appearance
してみましたNO
が、問題は解決しませんでした。
の中にあるViewController
がありますUINavigationcontroller
が、navigationBarは非表示になっています。iOS 7でアプリを実行すると、ステータスバーがビューの上に表示されます。これを回避する方法はありますか?
OS固有のコードを書きたくありません。
に設定View controller-based status bar appearance
してみましたNO
が、問題は解決しませんでした。
回答:
Xcode 5は、iOS 6/7 Deltas
この問題を解決するために特別に作成されています。ストーリーボードで、ビューを20ピクセル下に移動してiOS 7で正しく見えるようにし、iOS 6と互換性を持たせるために、Delta y
-20 に変更しました。
私のストーリーボードは自動レイアウトを使用していないため、iOS 6でビューの高さを適切にサイズ変更するには、Delta height
と同様に設定する必要がありましたDelta Y
。
ステータスバーがまったく不要な場合は、このデータでplistを更新する必要があります。これを行うには、plistで次の2つの設定を追加します。
<key>UIStatusBarHidden</key>
<true/>
<key>UIViewControllerBasedStatusBarAppearance</key>
<false/>
iOS 7では、オーバーレイされた透明なステータスバーを念頭に置いてアプリを設計する必要があります。たとえば、新しいiOS 7 Weatherアプリをご覧ください。
これはUIViewController
iOS 7のデフォルトの動作です。ビューは全画面表示になります。つまり、ステータスバーがビューの上部を覆います。
あなたが持っている場合はUIViewController
内UINavigationController
とnavigationBarが表示されている、あなたは、次のコードを持つことができるviewDidLoad
かnavigationBarはトリックを行うための背景画像を持っています。
self.edgesForExtendedLayout = UIRectEdgeNone;
navigationBarを非表示にしている場合は、20ポイントをシフトしてすべてのUIView要素を調整する必要があります。他の解決策はありません。自動レイアウトを使用すると少し役立ちます。
下位互換性が必要な場合に、iOSバージョンを検出するためのサンプルコードを次に示します。
NSUInteger DeviceSystemMajorVersion() {
static NSUInteger _deviceSystemMajorVersion = -1;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSString *systemVersion = [UIDevice currentDevice].systemVersion;
_deviceSystemMajorVersion = [[systemVersion componentsSeparatedByString:@"."][0] intValue];
});
return _deviceSystemMajorVersion;
}
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
私が自分で作った唯一の実用的な解決策。
ここに私のUIViewControllerサブクラスがありますhttps://github.com/comonitos/ios7_overlaping
1 UIViewControllerのサブクラス
2そのクラスからwindow.rootViewControllerをサブクラス化します。
3出来上がり!
- (void) viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect screen = [[UIScreen mainScreen] bounds];
if (self.navigationController) {
CGRect frame = self.navigationController.view.frame;
frame.origin.y = 20;
frame.size.height = screen.size.height - 20;
self.navigationController.view.frame = frame;
} else {
if ([self respondsToSelector: @selector(containerView)]) {
UIView *containerView = (UIView *)[self performSelector: @selector(containerView)];
CGRect frame = containerView.frame;
frame.origin.y = 20;
frame.size.height = screen.size.height - 20;
containerView.frame = frame;
} else {
CGRect frame = self.view.frame;
frame.origin.y = 20;
frame.size.height = screen.size.height - 20;
self.view.frame = frame;
}
}
}
}
4これを追加して、ステータスバーを白くします[self.window makeKeyAndVisible]の直後に; !!!
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
[[UIApplication sharedApplication] setStatusBarStyle:UIStatusBarStyleLightContent];
}
-(UIStatusBarStyle)preferredStatusBarStyle
{
return UIStatusBarStyleLightContent;
}
-(void)viewWillLayoutSubviews{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
{
self.view.clipsToBounds = YES;
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat screenHeight = 0.0;
if(UIDeviceOrientationIsPortrait([[UIApplication sharedApplication] statusBarOrientation]))
screenHeight = screenRect.size.height;
else
screenHeight = screenRect.size.width;
CGRect screenFrame = CGRectMake(0, 20, self.view.frame.size.width,screenHeight-20);
CGRect viewFrame1 = [self.view convertRect:self.view.frame toView:nil];
if (!CGRectEqualToRect(screenFrame, viewFrame1))
{
self.view.frame = screenFrame;
self.view.bounds = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
}
}
}
キーをplistに追加---コントローラベースのステータスバーの外観を表示:いいえ
ios7でステータスバーを非表示にするには、次の簡単な手順に従います。
Xcodeで「Resources
」フォルダに移動し、「(app name)-Info.plist file
」を開きます。
View controller based status bar appearance
」キーをチェックし、その値を設定します「NO
」Status bar is initially hidden
」キーをチェックし、その値を設定します「YES
」キーがそこにない場合はinformation property list
、上部にある「」を選択し、+アイコンをクリックして追加できます。
完全に隠したいだけで、対処しない場合は、これでうまくいきます。
-(BOOL) prefersStatusBarHidden
{
return YES;
}
xib
s を使用する場合、非常に簡単な実装は、ビューの階層が次のようになるように、サイズ変更フラグ(既に3.5インチと4インチの互換性のために使用している)を含むコンテナービュー内のすべてのサブビューをカプセル化することです。
でviewDidLoad
、次のようにします。
- (void)viewDidLoad
{
[super viewDidLoad];
// initializations
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) // only for iOS 7 and above
{
CGRect frame = containerView.frame;
frame.origin.y += 20;
frame.size.height -= 20;
containerView.frame = frame;
}
}
この方法では、iOS 7との互換性のためにペン先を変更する必要はありません。背景がある場合は、外側に置いてcontainerView
画面全体を覆うようにすることができます。
ヴィンセントの答えedgeForExtendedLayoutは私のために働いた。
これらのマクロは、OSのバージョンを判別しやすくするのに役立ちます
// 7.0 and above
#define IS_DEVICE_RUNNING_IOS_7_AND_ABOVE() ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending)
// 6.0, 6.0.x, 6.1, 6.1.x
#define IS_DEVICE_RUNNING_IOS_6_OR_BELOW() ([[[UIDevice currentDevice] systemVersion] compare:@"6.2" options:NSNumericSearch] != NSOrderedDescending)
これらのマクロをプロジェクトのprefix.pchファイルに追加すると、どこからでもアクセスできます
if(IS_DEVICE_RUNNING_IOS_7_AND_ABOVE())
{
//some iOS 7 stuff
self.edgesForExtendedLayout = UIRectEdgeNone;
}
if(IS_DEVICE_RUNNING_IOS_6_OR_BELOW())
{
// some old iOS stuff
}
私はこれと同じ質問で別の投稿に私の回答を投稿しました。
Apple iOS7移行ガイドから、https: //developer.apple.com/library/ios/documentation/UserExperience/Conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1
具体的にautomaticallyAdjustsScrollViewInsets=YES
とset self.edgesForExtendedLayout = UIRectEdgeNone
私が重複したくないと私は持っていたときに私の作品tableviewcontroller
。
YTPlayerの横向きビューから戻った後、ステータスバーとナビゲーションバーが重なります。@comonitosのバージョンを試した後の私の解決策は次のとおりですが、iOS 8では機能しません
- (void)fixNavigationBarPosition {
if (self.navigationController) {
CGRect frame = self.navigationController.navigationBar.frame;
if (frame.origin.y != 20.f) {
frame.origin.y = 20.f;
self.navigationController.navigationBar.frame = frame;
}
}
}
ナビゲーションバーの位置を固定したいときはいつでも、この関数を呼び出してください。YTPlayerViewDelegateを呼び出しましたplayerView:didChangeToState:
- (void)playerView:(YTPlayerView *)playerView didChangeToState:(YTPlayerState)state {
switch (state) {
case kYTPlayerStatePaused:
case kYTPlayerStateEnded:
[self fixNavigationBarPosition];
break;
default:
}
}