IOS9 3D Touch APIs
Bài đăng này đã không được cập nhật trong 9 năm
1.UIViewController
iOS 9 cấu hình cho view controller tính năng mới peek và pop của UIKit, tính năng này giúp cho người dùng có thể xem trước nội dung bổ sung khi mà một người dùng nhấn vào một view xác định và pop giúp cho người dùng khẳng định xem nội dung đó và điều hướng tới nó. Để hỗ trợ việc peek và pop trên các thiết bị có hỗ trợ 3D Touch thì iOS9 SDK đã hỗ trợ một số phương thức mới trong UIViewController để register và unregister một view controller cho hiệu ứng 3D Touch. Thuật ngữ người dùng cuối cho view được trình bày trong những giai đoạn nền tảng là các touches bao gồm peek và pop. Để hiểu rõ hơn chúng ta sẽ tìm hiểu rõ hơn các phương thức của lớp được cung cấp trong iOS9 này
@available(iOS 9.0, *)
override func registerForPreviewingWithDelegate(delegate: UIViewControllerPreviewingDelegate,
sourceView: UIView) -> UIViewControllerPreviewing {
}
Ở đây chúng ta có thêm dòng @available(iOS 9.0, *) để thông báo các hàm này sẽ sử dụng chỉ cho iOS9 và các phiên bản sau. Đối tượng delegate là trung gian trong việc trình diễn của views từ việc xem trước (peek) view controller và cam kết (pop) xem view controller. Trong thực tế thì đây là 2 view controller giống nhau. delegate thực hiện việc điều chỉnh thông qua các hiện thực của bạn trong các phương thức của UIViewControllerPreviewingDelegate. Trong delegate này chúng ta có 2 phương thức:
func previewingContext(_ previewingContext: UIViewControllerPreviewing,
viewControllerForLocation location: CGPoint) -> UIViewController?
phương thức này được gọi khi người dùng thực hiện ấn vào một nguồn view nào đó trong việc xem trước các view controller với giá trị trả về là view controller mà bạn muốn preview(peek) hoặc nil nếu disable preview.
Phương thức thứ 2 được gọi khi bạn chuẩn bị đưa ra một pop view từ viewcontroller
func previewingContext(_ previewingContext: UIViewControllerPreviewing,
commitViewController viewControllerToCommit: UIViewController)
Giá trị trả về của phương thức
registerForPreviewingWithDelegate(_:sourceView:)
trong UIViewController là một đối tượng để quản lý việc xem trước các view.Đối tượng này thoả mãn với UIViewControllerPreviewing protocol.
Phương thức thứ 2 mà UIViewController cung cấp để chúng ta làm việc với 3D touch là
func unregisterForPreviewingWithContext(_ previewing: UIViewControllerPreviewing)
phương thức này sẽ được gọi tự động khi một 3DTouch-registered bị deallocated. Tuy nhiên trong một vài trường hợp bạn phải gọi rõ ràng phương thức này. Trong trường hợp hệ thống view của một registered view controller thay đổi trạng thái thì bạn nên gọi phương thức này một cách rõ ràng để hiện thực các phần xử lý trong phương thức. Phương thức cuối cùng trong 3 phương thức này là:
func previewActionItems() -> [UIPreviewActionItem]
giá trị trả về là mảng các peek.
2.WebView
ở WebView thì bạn hoàn toàn có thể enable tính năng peek và pop cho các đường dẫn và phát hiện dữ liệu sử được sử dụng thông qua thuộc tính mới được cung cấp kể từ iOS9 là allowsLinkPreview của WKWebView của Webkit framework và UIWebView của UIKit framework. Ngoài ra các tính năng này còn được tự động trong lớp SFSafariViewController.
3. UITouch
iOS 9 SDK đã tích hợp thêm 2 thuộc tính cho UITouch để có thể làm việc tốt hơn với 3D touch.
- force là thuộc tính cho chúng ta biết lực của touch vào màn hình. thuộc tính này được tính bởi hệ thống nên các lập trình viên chỉ có thể đọc nó mà không thể thay đổi giá trị của nó ngoài việc người dùng touch thực tế vào màn hình. Giá trị mặc định là một nếu một touch có lực trung bình.
- maximumPossibleForce là thuộc tính cho biết giá trị lớn nhất của lực touch vào màn hình.
4. Demo Chúng ta sẽ tạo một ứng dụng đơn giản để có sử dụng các APIs này. Tạo một project template của xcode sau đó mở project. Đầu tiên chúng ta cần register cho việc peek hay pop view trong phương thức viewDidLoad() nhứ sau:
override func viewDidLoad() {
super.viewDidLoad()
registerForPreviewingWithDelegate(self, sourceView: view)
}
Tuy nhiên các thiết bị hỗ trợ cho 3D touch chưa nhiều nên chúng ta cần kiểm tra xem thiết bị có hỗ trợ không khi đó chúng ta mới thực hiện register. Bổ sung phương thức viewDidLoad() như sau:
override func viewDidLoad() {
super.viewDidLoad()
if traitCollection.forceTouchCapability == .Available {
registerForPreviewingWithDelegate(self, sourceView: view)
} else {
alertController = UIAlertController(title: "3D Touch Not Available", message: "Unsupported device.", preferredStyle: .Alert)
}
}
Ở đây chúng ta kiểm tra xem thiết bị có hỗ trợ không, nếu hỗ trợ chúng ta mới register nó và không thì sẽ xuất ra một thông báo. Tiếp theo chúng ta cần viết các phương thức delegate của UIViewControllerPreviewingDelegate bao gồm 2 hàm như sau:
func previewingContext(previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
guard let indexPath = tableView.indexPathForRowAtPoint(location), cell = tableView.cellForRowAtIndexPath(indexPath) else { return nil }
guard let detailViewController = storyboard?.instantiateViewControllerWithIdentifier("DetailViewController") as? DetailViewController else { return nil }
let previewDetail = sampleData[indexPath.row]
detailViewController.detailItemTitle = previewDetail.title
detailViewController.preferredContentSize = CGSize(width: 0.0, height: previewDetail.preferredHeight)
previewingContext.sourceRect = cell.frame
return detailViewController
}
func previewingContext(previewingContext: UIViewControllerPreviewing, commitViewController viewControllerToCommit: UIViewController) {
showViewController(viewControllerToCommit, sender: self)
}
Như vậy ta đã tiến hành viết 1 số phương thức cần thiết để có thể sử dụng được peek và pop trong UIViewController và có một demo đơn giản trên các view.
All rights reserved