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アプリをご覧ください。
これはiOS 7のUIViewController
のデフォルトの動作です。ビューはフルスクリーンになり、ステータスバーがビューの上部に表示されます。
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;
}
自分で作った唯一の実用的なソリューション
ここに私の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
」を選択し、+アイコンをクリックして追加できます
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
の外に置いて、画面全体をカバーできます。
ステータスバーを削除するために必要なのはこれだけです。
完全に隠したいだけで対処したくない場合は、これでうまくいきます。
-(BOOL) prefersStatusBarHidden
{
return YES;
}
ナビゲーションバーの場合:
このコードを書く:
self.navigationController.navigationBar.translucent = NO;
ちょうど私のためにトリックをしました。
ビンセントの答えedgesForExtendedLayoutは私のために働いた。
これらのマクロは、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
}
この質問と同じ質問で別の投稿に回答を投稿しました。
具体的には、automaticallyAdjustsScrollViewInsets=YES
とset self.edgesForExtendedLayout = UIRectEdgeNone
は、オーバーラップしたくないときにtableviewcontroller
を持っているときに機能します。
「自動レイアウトを使用」を任意のコストで有効にする場合は、viewdidloadに次のコードを配置します。
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
{
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
}
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:
}
}