edgesForExtendedLayout và automaticallyAdjustsScrollViewInsets của UIViewController

Mở đầu

UIViewController là nền tảng của mỗi ứng dụng IOS.Mỗi view controller đều quản lý vị trí các giao diện cũng như các mỗi quan hệ giữa các giao diện với nhau.Tất cả các IOS app đều có ít nhất 1 UIViewController và việc chuyển các view controllers trong 1 ứng dụng IOS đã trở nên quen thuộc đối với các lập trình viên. Bắt đầu từ IOS 7, mặc định view controller sử dụng full-screen layout khi present UIViewController và do đó, cũng có nhiều properties quyết định cách trình bày khác nhau cho view ở trong UIViewController đó.

edgesForExtendedLayout

Thuộc tính này quyết định view của ViewController có thể cover toàn bộ màn hình hay không. Ví dụ, bạn muốn push 1 UIViewController vào UINavigationController.

let viewController = UIViewController()
viewController.view.backgroundColor = UIColor.redColor()
let navigationController = UINavigationController(rootViewController: viewController)

Đoạn code này ko thiết lập thuộc tính edgesForExtendedLayout của viewController, cho nên mặc định sẽ là UIRectEdgeAll. Và đây là kết quả:

Dễ dàng nhận thấy rằng, phần view màu đỏ nằm dưới navigation bar của view controller.Phần view của ViewController cover tất cả màn hình của device Đoạn code tiếp theo sẽ thiết lập thuộc tình edgesForExtendedLayout là UIRectEdge.None

let viewController = UIViewController()
viewController.view.backgroundColor = UIColor.redColor()
viewController.edgesForExtendedLayout = UIRectEdge.None
let navigationController = UINavigationController(rootViewController: viewController)

Với thiết lập này thì phần view sẽ không cover toàn bộ mà hình mà nó được nằm từ bottom của navigation bar.

automaticallyAdjustsScrollViewInsets

Thuộc tính này được dùng trong trường hợp nếu view trong controller là UIScrollView hay subclass của nó (UITableView...). Nếu set thuộc tính này automaticallyAdjustsScrollViewInsets to YES, UIViewController sẽ tự động điều chỉnh insets của UITableView để phần nội dụng của UITableView luôn nằm dưới navigation bar nhưng UIScrollView vẫn cover toàn bộ màn hình.

Ngược lại, nếu set automaticallyAdjustsScrollViewInsets to NO.

extendedLayoutIncludesOpaqueBars

Thuộc tính này chỉ bổ sung cho thuộc tính bên trên. Nếu status bar là opaque, thì view của UIViewcontroller cũng ko extend để include thanh status bar nêu thuộc tính này là YES. Do đó, nếu muốn extend view để cover navigationbar (edgesForExtendedLayout to UIRectEdgeAll) và thuộc tính này là NO thì nó ko cover thanh status bar nếu là opaque

Kết

Với 3 thuộc tính này của UIViewcontroller, hi vọng các bạn có thể điểu chỉnh view trong UIViewController 1 cách hợp lý, tránh hardcode trong nhiều trường hợp.