ipsw - ios7新功能




狀態欄和導航欄顯示在iOS 7中的視圖邊界上 (13)

Swift 3 / Swift 4解決方案也適用於iOS 10+中的NIBs / XIB文件:

override func viewDidLoad() {
    super.viewDidLoad()

    edgesForExtendedLayout = []
}

我最近下載了Xcode 5 DP來在iOS 7中測試我的應用程序。我注意到並確認的第一件事是我的視圖邊界並不總是調整到狀態欄和導航欄的大小。

viewDidLayoutSubviews ,我打印視圖的邊界:

{{0,0},{320,568}}

這會導致我的內容出現在導航欄和狀態欄下方。

我知道我可以通過獲得主屏幕的高度來減去狀態欄的高度和導航欄的高度來解釋高度,但這似乎是不必要的額外工作。

我該如何解決這個問題?

更新:

我找到了解決這個問題的解決方案。 將導航欄的半透明屬性設置為NO:

self.navigationController.navigationBar.translucent = NO;

這將修復導航欄和狀態欄下面的視圖。

但是,當您希望導航欄變為半透明時,我還沒有找到解決方案。 例如,全屏查看照片,我希望導航欄半透明,並在其下面框住視圖。 這有效,但當我切換顯示/隱藏導航欄時,我遇到了更奇怪的結果。 第一個子視圖(UIScrollView)每次都會更改其原點的邊界。


Swift解決方案:

override func viewWillAppear(animated: Bool) {
    self.edgesForExtendedLayout = UIRectEdge.None
}

斯威夫特3

override func viewWillAppear(_ animated: Bool) {
    self.edgesForExtendedLayout = []
}

像這樣對Top Layout進行限制


在下拉列表中添加一個“View Controller-based status bar appearance”鍵作為info.plist的一行。 像這樣的東西:


在您的應用程序plist文件中添加一行,將其稱為“查看基於控制器的狀態欄外觀”並將其設置為NO


如果你想讓視圖具有半透明的導航欄(這是很好的),你必須設置一個contentInset或類似的。

以下是我如何做到的:

// Check if we are running on ios7
if([[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."][0] intValue] >= 7) {
      CGRect statusBarViewRect = [[UIApplication sharedApplication] statusBarFrame];
      float heightPadding = statusBarViewRect.size.height+self.navigationController.navigationBar.frame.size.height;

      myContentView.contentInset = UIEdgeInsetsMake(heightPadding, 0.0, 0.0, 0.0);
}

對我而言,最簡單的解決方法是在plist中添加兩個鍵


您可以通過在iOS7 SDK中實現一個名為edgesForExtendedLayout的新屬性來實現此目的。 請添加以下代碼來實現此目的,

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

您需要在-(void)viewDidLoad方法中添加上述內容。

iOS 7對您如何佈局和自定義UI外觀進行了一些更改。 視圖控制器佈局,色調和字體的變化會影響應用中的所有UIKit對象。 另外,手勢識別器API的增強功能可以更好地控製手勢交互。

使用視圖控制器

在iOS 7中,視圖控制器使用全屏佈局。 同時,iOS 7可以讓您更細緻地控制視圖控制器佈置其視圖的方式。 特別是,全屏佈局的概念已經完善,可以讓視圖控制器指定其視圖每個邊緣的佈局。

在iOS 7中不推薦使用wantsFullScreenLayout視圖控制器屬性。如果當前指定wantsFullScreenLayout = NO ,則視圖控制器在iOS 7中運行時可能會在意外的屏幕位置顯示其內容。

要調整視圖控制器佈局視圖的方式, UIViewController提供了以下屬性:

  • edgesForExtendedLayout

edgesForExtendedLayout屬性使用UIRectEdge類型,除了指定none和all以外,還指定矩形的四個邊中的每一個。 使用edgesForExtendedLayout來指定視圖的哪些邊應該被擴展,而不管酒吧的半透明度如何。 默認情況下,此屬性的值為UIRectEdgeAll

  • extendedLayoutIncludesOpaqueBars

如果您的設計使用不透明條紋, edgesForExtendedLayout還可以通過將extendedLayoutIncludesOpaqueBars屬性設置為NO來優化edgesForExtendedLayout 。 ( extendedLayoutIncludesOpaqueBars的默認值為NO 。)

  • automaticallyAdjustsScrollViewInsets

如果您不想自動調整滾動視圖的內容插頁,請將automaticallyAdjustsScrollViewInsets調整滾動視圖插入設置為NO 。 ( automaticallyAdjustsScrollViewInsets的默認值為YES 。)

  • topLayoutGuide,bottomLayoutGuide

topLayoutGuidebottomLayoutGuide屬性指示視圖控制器視圖中頂部或底部條邊的位置。 如果條應與視圖的頂部或底部重疊,則可以使用Interface Builder通過在topLayoutGuide的底部或topLayoutGuide的頂部創建約束來定位視圖相對於條的位置。 (如果沒有條應與視圖重疊,則topLayoutGuide的底部與視圖的頂部相同,而topLayoutGuide的頂部與視圖的底部相同。)這兩個屬性都是在請求時延遲創建的。

請參閱蘋果文檔


我以編程方式創建了我的視圖,並最終為我工作:

- (void) viewDidLayoutSubviews {
    // only works for iOS 7+
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;

        // snaps the view under the status bar (iOS 6 style)
        viewBounds.origin.y = topBarOffset * -1;

        // shrink the bounds of your view to compensate for the offset
        viewBounds.size.height = viewBounds.size.height + (topBarOffset * -1);
        self.view.bounds = viewBounds;
    }
}

Source (位於第39頁底部的topLayoutGuide部分)。


我想擴展Stunner的答案,並添加if語句來檢查它是否是iOS-7,因為當我在iOS 6上測試它時,我的應用程序會崩潰。

補充將增加:

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)

所以我建議將這種方法添加到MyViewControler.m文件中:

- (void) viewDidLayoutSubviews {
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
        CGRect viewBounds = self.view.bounds;
        CGFloat topBarOffset = self.topLayoutGuide.length;
        viewBounds.origin.y = topBarOffset * -1;
        self.view.bounds = viewBounds;
    }
}

我有一個場景,我使用Apple編寫的BannerViewController來顯示我的廣告以及BannerViewController中嵌入的ScrollViewController。

為了防止導航欄隱藏我的內容,我必須做出兩處更改。

1)修改BannerViewController.m

- (void)viewDidLoad
{
   [super viewDidLoad];
   float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
   if (systemVersion >= 7.0) {
      self.edgesForExtendedLayout = UIRectEdgeNone;
   }
}

2)修改我的ScrollViewContoller

- (void)viewDidLoad
{
    [super viewDidLoad];
    float systemVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
    if (systemVersion >= 7.0) {
        self.edgesForExtendedLayout = UIRectEdgeBottom;
    }
}

現在廣告正確顯示在視圖的底部,而不是被導航欄覆蓋,而頂部的內容未被截斷。


步驟隱藏iOS 7中的狀態欄:

1.轉到您的應用程序info.plist文件。

2.And Set,基於視圖控制器的狀態欄外觀:Boolean NO

希望我解決了狀態欄問題.....







ios7