Vùng an toàn của Xcode 9


150

Trong khi khám phá Xcode9 Beta Tìm thấy Vùng an toàn trên Trình tạo giao diện Xem trình xem phân cấp. Tò mò và cố gắng biết về Tài liệu về Khu vực an toàn trên Táo, trong tài liệu chính, tài liệu nói "Khu vực xem tương tác trực tiếp với bố cục Tự động" Nhưng nó không làm tôi hài lòng, tôi muốn biết cách sử dụng thực tế của điều mới này.

Có ai có một số đầu mối?

nhập mô tả hình ảnh ở đây

Kết luận đoạn từ tài liệu Apple cho khu vực an toàn.

Lớp UILayoutGuide được thiết kế để thực hiện tất cả các tác vụ được thực hiện trước đó bởi các khung nhìn giả, nhưng để thực hiện nó theo cách an toàn hơn, hiệu quả hơn. Hướng dẫn bố trí không xác định một cái nhìn mới. Họ không tham gia vào hệ thống phân cấp xem. Thay vào đó, họ chỉ cần xác định vùng hình chữ nhật trong hệ tọa độ của chế độ xem sở hữu có thể tương tác với Bố cục tự động.


1
Bạn có thể xem Phiên WWDC. Tất cả mọi thứ được giải thích ở đó. Tôi không chắc về cái tên này. Một cái gì đó với Xcode hoặc InterfaceBuilder trong tên của nó.
Maik639

Câu trả lời:


282

Khu vực an toàn là một hướng dẫn bố trí ( Hướng dẫn bố trí khu vực an toàn ) .
Hướng dẫn bố cục đại diện cho phần của chế độ xem của bạn không bị che khuất bởi các thanh và nội dung khác. Trong iOS 11+, Apple không dùng các hướng dẫn bố cục trên cùng và dưới cùng và thay thế chúng bằng một hướng dẫn bố cục khu vực an toàn duy nhất.

Khi chế độ xem hiển thị trên màn hình, hướng dẫn này phản ánh phần của chế độ xem không được bao phủ bởi nội dung khác. Vùng an toàn của chế độ xem phản ánh khu vực được bao phủ bởi các thanh điều hướng, thanh tab, thanh công cụ và các tổ tiên khác che khuất tầm nhìn của bộ điều khiển chế độ xem. (Trong tvOS, vùng an toàn kết hợp với viền màn hình, như được xác định bởi thuộc overscanCompensationInsetstính của UIScreen.) Nó cũng bao gồm bất kỳ không gian bổ sung nào được xác định bởi thuộc additionalSafeAreaInsetstính của bộ điều khiển xem . Nếu chế độ xem hiện chưa được cài đặt trong cấu trúc phân cấp chế độ xem hoặc chưa hiển thị trên màn hình, hướng dẫn bố cục luôn khớp với các cạnh của chế độ xem.

Đối với chế độ xem gốc của trình điều khiển chế độ xem, vùng an toàn trong thuộc tính này biểu thị toàn bộ phần nội dung của trình điều khiển chế độ xem bị che khuất và bất kỳ nội dung bổ sung nào bạn đã chỉ định. Đối với các chế độ xem khác trong phân cấp chế độ xem, vùng an toàn chỉ phản ánh phần của chế độ xem bị che khuất. Ví dụ: nếu một khung nhìn hoàn toàn nằm trong vùng an toàn của chế độ xem gốc của trình điều khiển khung nhìn của nó, thì các góc cạnh trong thuộc tính này là 0.

Theo Apple, Xcode 9 - Phát hành
giao diện Trình tạo giao diện sử dụng UIView.safeAreaLayoutGuide để thay thế cho các hướng dẫn bố cục trên và dưới không dùng nữa trong UIViewContoder. Để sử dụng vùng an toàn mới, chọn Hướng dẫn bố trí vùng an toàn trong Trình kiểm tra tệp cho trình điều khiển xem, sau đó thêm các ràng buộc giữa nội dung của bạn và các neo vùng an toàn mới. Điều này ngăn nội dung của bạn khỏi bị che khuất bởi các thanh trên cùng và dưới cùng và bởi khu vực quét quá mức trên tvOS. Các ràng buộc đối với vùng an toàn được chuyển đổi thành Trên và Dưới khi triển khai lên các phiên bản iOS trước đó.

nhập mô tả hình ảnh ở đây


Dưới đây là tài liệu tham khảo đơn giản dưới dạng so sánh (để tạo hiệu ứng hình ảnh tương tự) giữa Hướng dẫn bố cục (Trên & Dưới) hiện tại và Hướng dẫn bố cục vùng an toàn.

Bố trí khu vực an toàn: nhập mô tả hình ảnh ở đây

Tự động thanh toán

nhập mô tả hình ảnh ở đây


Làm thế nào để làm việc với Bố cục khu vực an toàn?

Thực hiện theo các bước sau để tìm giải pháp:

  • Bật 'Bố cục vùng an toàn', nếu không được bật.
  • Xóa 'tất cả các ràng buộc' nếu chúng hiển thị kết nối với Super view và đính kèm lại tất cả với neo bố cục an toàn. HOẶC Nhấp đúp chuột vào một ràng buộc và chỉnh sửa kết nối từ chế độ xem siêu sang neo SafeArea

Dưới đây là ảnh chụp mẫu, cách bật bố cục vùng an toàn và chỉnh sửa ràng buộc.

nhập mô tả hình ảnh ở đây

Đây là kết quả của những thay đổi trên

nhập mô tả hình ảnh ở đây


Thiết kế bố cục với SafeArea
Khi thiết kế cho iPhone X, bạn phải đảm bảo rằng bố cục lấp đầy màn hình và không bị che khuất bởi các góc tròn, vỏ cảm biến hoặc chỉ báo để truy cập Màn hình chính của thiết bị.

nhập mô tả hình ảnh ở đây

Hầu hết các ứng dụng sử dụng các thành phần UI tiêu chuẩn, do hệ thống cung cấp như thanh điều hướng, bảng và bộ sưu tập sẽ tự động thích ứng với yếu tố hình thức mới của thiết bị. Các vật liệu nền mở rộng ra các cạnh của màn hình và các thành phần UI được chèn và định vị thích hợp.

nhập mô tả hình ảnh ở đây

Đối với các ứng dụng có bố cục tùy chỉnh, việc hỗ trợ iPhone X cũng tương đối dễ dàng, đặc biệt nếu ứng dụng của bạn sử dụng Bố cục tự động và tuân thủ các hướng dẫn bố cục lề và vùng an toàn.

nhập mô tả hình ảnh ở đây


Dưới đây là mã mẫu (Tham khảo từ: Hướng dẫn bố cục khu vực an toàn ) :
Nếu bạn tạo các ràng buộc trong mã, hãy sử dụng thuộc tính safeAreaLayoutGuide của UIView để lấy các neo bố cục có liên quan. Hãy tạo lại ví dụ Trình tạo giao diện ở trên trong mã để xem nó trông như thế nào:

Giả sử chúng ta có chế độ xem xanh như một thuộc tính trong trình điều khiển chế độ xem của mình:

private let greenView = UIView()

Chúng tôi có thể có một chức năng để thiết lập các khung nhìn và các ràng buộc được gọi từ viewDidLoad:

private func setupView() {
  greenView.translatesAutoresizingMaskIntoConstraints = false
  greenView.backgroundColor = .green
  view.addSubview(greenView)
}

Tạo các ràng buộc lề hàng đầu và theo sau như mọi khi sử dụng layoutMarginsGuide của chế độ xem gốc:

 let margins = view.layoutMarginsGuide
    NSLayoutConstraint.activate([
      greenView.leadingAnchor.constraint(equalTo: margins.leadingAnchor),
      greenView.trailingAnchor.constraint(equalTo: margins.trailingAnchor)
 ])

Bây giờ trừ khi bạn chỉ nhắm mục tiêu iOS 11, bạn sẽ cần bọc các ràng buộc hướng dẫn bố cục khu vực an toàn với #av Available và quay lại hướng dẫn bố cục trên cùng và dưới cùng cho các phiên bản iOS trước đó:

if #available(iOS 11, *) {
  let guide = view.safeAreaLayoutGuide
  NSLayoutConstraint.activate([
   greenView.topAnchor.constraintEqualToSystemSpacingBelow(guide.topAnchor, multiplier: 1.0),
   guide.bottomAnchor.constraintEqualToSystemSpacingBelow(greenView.bottomAnchor, multiplier: 1.0)
   ])

} else {
   let standardSpacing: CGFloat = 8.0
   NSLayoutConstraint.activate([
   greenView.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: standardSpacing),
   bottomLayoutGuide.topAnchor.constraint(equalTo: greenView.bottomAnchor, constant: standardSpacing)
   ])
}


Kết quả:

nhập mô tả hình ảnh ở đây


Theo UIViewtiện ích mở rộng, giúp bạn dễ dàng làm việc với SafeAreaLayout theo chương trình.

extension UIView {

  // Top Anchor
  var safeAreaTopAnchor: NSLayoutYAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.topAnchor
    } else {
      return self.topAnchor
    }
  }

  // Bottom Anchor
  var safeAreaBottomAnchor: NSLayoutYAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.bottomAnchor
    } else {
      return self.bottomAnchor
    }
  }

  // Left Anchor
  var safeAreaLeftAnchor: NSLayoutXAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.leftAnchor
    } else {
      return self.leftAnchor
    }
  }

  // Right Anchor
  var safeAreaRightAnchor: NSLayoutXAxisAnchor {
    if #available(iOS 11.0, *) {
      return self.safeAreaLayoutGuide.rightAnchor
    } else {
      return self.rightAnchor
    }
  }

}

Đây là mã mẫu trong Objective-C :


Dưới đây là Tài liệu chính thức dành cho nhà phát triển của Apple dành cho Hướng dẫn bố cục khu vực an toàn


Khu vực an toàn là cần thiết để xử lý thiết kế giao diện người dùng cho iPhone-X. Dưới đây là hướng dẫn cơ bản về Cách thiết kế giao diện người dùng cho iPhone-X bằng cách sử dụng Bố cục vùng an toàn


Đối với sự khác biệt giữa marginsview.leadingAnchor: khi bạn sử dụng let margins = view.layoutMarginsGuidevà sử dụng sau này margins.leadingAnchor, bạn đang giới hạn chế độ xem theo lề của chế độ xem. Điều này sẽ thêm một số không gian thêm cho các bên. Nếu bạn không muốn điều đó thì chỉ cần sử dụng view.leadingAnchorview.trailingAnchorbạn sẽ không thấy bất kỳ khoảng trắng nào ở bên trái hoặc bên phải ...
Honey

"Vùng an toàn của chế độ xem phản ánh khu vực được bao phủ bởi các thanh điều hướng, thanh tab, thanh công cụ và các tổ tiên khác che khuất tầm nhìn của bộ điều khiển chế độ xem" Bạn có nghĩa là không được bảo hiểm? Tài liệu nói " không bị che khuất bởi các thanh và nội dung khác."
Mật ong

Tôi đã thấy một hành vi lạ trong Xcode 10.1 trong đó Vùng an toàn sẽ không mở rộng xuống phía dưới màn hình trên Chế độ xem toàn màn hình. Tôi tin rằng tôi đã gây ra nó bằng cách vô tình kéo một 'Tab Bar' xuống dưới cùng, và sau đó xóa nó. Tôi tìm thấy dòng này trong tệp .storyboard mà tôi đã xóa thủ công bằng trình soạn thảo văn bản. <simulationToolbarMetrics key = "simulationBottomBarMetrics" />. Điều này đã sửa nó.
Dave Hubbard

20

Tôi muốn đề cập đến thứ gì đó bắt gặp tôi đầu tiên khi tôi cố gắng điều chỉnh ứng dụng dựa trên SpriteKit để tránh các cạnh tròn và "notch" của iPhone X mới, như được đề xuất bởi Nguyên tắc giao diện con người mới nhất : Thuộc tính mới safeAreaLayoutGuidecủa UIViewnhu cầu được truy vấn sau khi chế độ xem được thêm vào cấu trúc phân cấp (ví dụ: bật -viewDidAppear:) để báo cáo khung bố cục có ý nghĩa (nếu không, nó chỉ trả về kích thước toàn màn hình).

Từ tài liệu của khách sạn:

Hướng dẫn bố cục đại diện cho phần của chế độ xem của bạn không bị che khuất bởi các thanh và nội dung khác. Khi chế độ xem hiển thị trên màn hình , hướng dẫn này phản ánh phần của chế độ xem không được bao phủ bởi các thanh điều hướng, thanh tab, thanh công cụ và các chế độ xem tổ tiên khác. (Trong tvOS, vùng an toàn phản ánh vùng không được che chắn của màn hình.) Nếu chế độ xem hiện chưa được cài đặt trong cấu trúc phân cấp chế độ xem hoặc chưa hiển thị trên màn hình, các cạnh của hướng dẫn bố cục bằng với các cạnh của chế độ xem .

(nhấn mạnh của tôi)

Nếu bạn đọc nó sớm nhất -viewDidLoad:, layoutFramehướng dẫn sẽ {{0, 0}, {375, 812}}thay vì mong đợi{{0, 44}, {375, 734}}


Tương tự ở đây. Tôi luôn luôn nhảy vào các thuộc tính có sẵn của một loại, chỉ được hướng dẫn bằng tên của chúng mà không đọc đầy đủ các tài liệu ...
Nicolas Miari

18

nhập mô tả hình ảnh ở đây

  • Trước đó trong iOS 7.0, 1111 < Deprecated > UIKitsử dụng topLayoutGuide & bottomLayoutGuideUIViewtài sản
  • iOS11 + sử dụng safeAreaLayoutGuide cũng là UIViewtài sản

  • Bật hộp kiểm Hướng dẫn bố cục khu vực an toàn từ trình kiểm tra tệp.

  • Các khu vực an toàn giúp bạn đặt chế độ xem của mình trong phần hiển thị của giao diện tổng thể.

  • Trong tvOS , khu vực an toàn cũng bao gồm các miếng đệm quá mức của màn hình, đại diện cho khu vực được bao phủ bởi viền màn hình.

  • safeAreaLayoutGuide phản ánh phần của chế độ xem không được bao phủ bởi các thanh điều hướng, thanh tab, thanh công cụ và các chế độ xem tổ tiên khác.
  • Sử dụng các khu vực an toàn như một sự trợ giúp để đưa ra nội dung của bạn như UIButton vv

  • Khi thiết kế cho iPhone X, bạn phải đảm bảo rằng bố cục lấp đầy màn hình và không bị che khuất bởi các góc tròn, vỏ cảm biến hoặc chỉ báo để truy cập Màn hình chính của thiết bị.

  • Đảm bảo hình nền mở rộng ra các cạnh của màn hình và các bố cục có thể cuộn theo chiều dọc, như bảng và bộ sưu tập, tiếp tục cho đến cuối.

  • Thanh trạng thái cao hơn trên iPhone X so với các iPhone khác. Nếu ứng dụng của bạn giả định chiều cao của thanh trạng thái cố định cho nội dung định vị bên dưới thanh trạng thái, bạn phải cập nhật ứng dụng của mình thành nội dung định vị động dựa trên thiết bị của người dùng. Lưu ý rằng thanh trạng thái trên iPhone X không thay đổi chiều cao khi các tác vụ nền như ghi âm giọng nói và theo dõi vị trí được kích hoạt print(UIApplication.shared.statusBarFrame.height)//44 for iPhone X, 20 for other iPhones

  • Chiều cao của container chỉ số nhà là 34 điểm.

  • Khi bạn bật Hướng dẫn bố cục vùng an toàn, bạn có thể thấy thuộc tính ràng buộc vùng an toàn được liệt kê trong trình tạo giao diện.

nhập mô tả hình ảnh ở đây

Bạn có thể đặt những hạn chế với tương ứng của self.view.safeAreaLayoutGuidenhư-

ObjC:

  self.demoView.translatesAutoresizingMaskIntoConstraints = NO;
    UILayoutGuide * guide = self.view.safeAreaLayoutGuide;
    [self.demoView.leadingAnchor constraintEqualToAnchor:guide.leadingAnchor].active = YES;
    [self.demoView.trailingAnchor constraintEqualToAnchor:guide.trailingAnchor].active = YES;
    [self.demoView.topAnchor constraintEqualToAnchor:guide.topAnchor].active = YES;
    [self.demoView.bottomAnchor constraintEqualToAnchor:guide.bottomAnchor].active = YES;

Nhanh:

   demoView.translatesAutoresizingMaskIntoConstraints = false
        if #available(iOS 11.0, *) {
            let guide = self.view.safeAreaLayoutGuide
            demoView.trailingAnchor.constraint(equalTo: guide.trailingAnchor).isActive = true
            demoView.leadingAnchor.constraint(equalTo: guide.leadingAnchor).isActive = true
            demoView.bottomAnchor.constraint(equalTo: guide.bottomAnchor).isActive = true
            demoView.topAnchor.constraint(equalTo: guide.topAnchor).isActive = true
        } else {
            NSLayoutConstraint(item: demoView, attribute: .leading, relatedBy: .equal, toItem: view, attribute: .leading, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: demoView, attribute: .trailing, relatedBy: .equal, toItem: view, attribute: .trailing, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: demoView, attribute: .bottom, relatedBy: .equal, toItem: view, attribute: .bottom, multiplier: 1.0, constant: 0).isActive = true
            NSLayoutConstraint(item: demoView, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1.0, constant: 0).isActive = true
        }

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


Tôi thấy hướng dẫn về dấu đầu dòng này rất hữu ích, nhưng "Vùng an toàn không bao gồm các thanh điều hướng, thanh tab, thanh công cụ và các chế độ xem tổ tiên khác" có nghĩa chính xác là gì?
Chewie The Chorkie

1
Ví dụ - Như trên Thanh công cụ trên màn hình cuối cùng (Hôm nay, Lịch & hộp thư đến) không được bao phủ bởi safreAreaGuide
Jack

8

Apple đã giới thiệu topLayoutGuide và bottomLayoutGuide như các thuộc tính của UIViewControll trở lại trong iOS 7. Họ cho phép bạn tạo các ràng buộc để giữ cho nội dung của bạn không bị ẩn bởi các thanh UIKit như trạng thái, điều hướng hoặc thanh tab. Các hướng dẫn bố cục này không được dùng trong iOS 11 và được thay thế bằng một hướng dẫn bố cục vùng an toàn duy nhất.

Tham khảo liên kết để biết thêm thông tin.


5

Hướng dẫn bố trí vùng an toàn giúp tránh gạch chân các thành phần UI hệ thống khi định vị nội dung và điều khiển.

Vùng an toàn là khu vực ở giữa các thành phần UI hệ thống là Thanh trạng thái, Thanh điều hướng và Thanh công cụ hoặc Thanh tab. Vì vậy, khi bạn thêm thanh Trạng thái vào ứng dụng của mình, Vùng an toàn sẽ co lại. Khi bạn thêm Thanh điều hướng vào ứng dụng của mình, Vùng an toàn sẽ co lại.

Trên iPhone X, Vùng an toàn cung cấp thêm hình ảnh từ các cạnh màn hình trên cùng và dưới cùng theo chiều dọc ngay cả khi không có thanh nào được hiển thị. Trong cảnh quan, Vùng an toàn được chèn từ các cạnh của màn hình và chỉ báo nhà.

Điều này được lấy từ video Thiết kế cho iPhone X của Apple , nơi họ cũng hình dung ra các yếu tố khác nhau ảnh hưởng đến Vùng an toàn như thế nào.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.