+1

Introduction 3D Touch in Swift

Với việc giới thiệu iPhone 6S, Apple đã trình bày tính năng mới mang tên 3D Touch. Nó là một lớp mới trên màn hình của thiết bị có thể phát hiện ra lực cảm ứng của người dùng tác động lên thiết bị. Để cấu hình sử dụng 3D Touch trên device của bạn. Bạn có thể làm theo hướng dẫn từ video

3D Touch cho phép các nhà phát triển cung cấp cho người dùng những trải nghiệm mới khi sử dụng ứng dụng.

3D Touch API có thể xử lý ba trường hợp sử dụng các cử chỉ khác nhau:

  • Home screen quick actions
  • UITouch force properties
  • Peek and Pop

Home screen quick actions

Quick actions được hiển thị khi bạn nhấn một lần vào biểu tượng ứng dụng trong màn hình Home.

Nó cho phép người dùng bắt đầu một số chức năng chính của ứng dụng nhanh hơn bằng cách mở một ứng dụng và tìm kiếm nó bên trong ứng dụng.

Như bạn thấy trên hình ảnh ở trên, trong ứng dụng ví dụ , chúng ta có ba hành động khác nhau có sẵn trong ứng dụng.

Để làm điều đó chúng ta phải sửa đổi Info.plist file và thêm một số lĩnh vực mới.

Đối với mỗi hành động, chúng ta cần thêm ít nhất ba khóa và giá trị khác nhau.

Thuộc tính đầu tiên đó là một biểu tượng (icon). Chúng ta có thể sử dụng các biểu tượng (icon) do Apple cung cấp cho một số hành động thông thường như phát, tạm dừng, chụp ảnh hoặc tìm kiếm. Cách thứ hai là thêm hình ảnh của riêng chúng ta vào resources và đặt tên của nó như là một giá trị cho UIApplicationShortcutIconFile key (Mình đã làm điều đó cho mục 2 trong ảnh chụp màn hình ở trên).

Key tiếp theo là UIApplicationShortcutItemTitle mà mình đoán là không thực sự cần giải thích. Thứ ba là UIApplicationShortcutItemType, và chúng ta hãy tập trung một chút vào cái này. Bạn cần nó để xác định loại hành động nhanh chóng để thực hiện. Dựa vào loại, chúng ta có thể xử lý tất cả các hành động nhanh được hỗ trợ trong một phương pháp.

Chúng ta đã hoàn thành bước đầu tiên, sau đây mình sẽ tại một enum với tất cả các actions

enum TouchActions: String {
    case special = "special"
    case favorite = "favorite"
    case search = "search"
   
    var number: Int {
        switch  self {
        case .special:
            return 2
        case .favorite:
            return 1
        case .search:
            return 0
        }
    }
}

Bước tiếp theo, chúng ta phải thực hiện một chức năng từ UIApplicationDelegate (được xác nhận bởi AppDelegate).

func application(_ application: UIApplication, performActionFor shortcutItem: UIApplicationShortcutItem, completionHandler: @escaping (Bool) -> Void) {
 
        guard let type = TouchActions(rawValue: shortcutItem.type) else {
            completionHandler(false)
            return
        }
        
        let selectedIndex = type.number
        (window?.rootViewController as? UITabBarController)?.selectedIndex = selectedIndex
      
        completionHandler(true)
}

Vì vậy, khi người dùng thực hiện lệnh forced touch , phương thứcexecuteActionFor được gọi, lúc đầu chúng ta phải kiểm tra xem loại action có trong các trường hợp enum của chúng ta không.

Nếu có, thì chúng ta có thể sử dụng index của nó để tải đúng ViewController. Điều quan trọng ở đây là completionHandler(true) cho chúng ta biết rằng mọi thứ đã ok và chúng ta có thể đi tiếp và hiển thị VC được lựa chọn cho người dùng.

Vậy là chúng ta đã xây dựng xong việc handle touch action ngoài màn hình Home. Rất đơn giản đúng không nào.

UITouch force

Tiếp theo chúng ta sẽ tìm hiểu một ví dụ khác của 3D Touch . Đó là UITouch force

Ban đầu, điều cần thiết là chúng ta kiểm tra được nếu người dùng có thể sử dụng 3D Touch và tạo ra hành vi phù hợp trong trường hợp 3D Touch không có sẵn.

Ở ví dụ dưới đây, trong trường hợp thiết bị không có hỗ trợ 3D Touch, tính năng này được thay bằng long press gesture.

Cách dễ nhất để kiểm tra nếu chúng ta có thể sử dụng 3D Touch là tạo một property như sau:

 var is3DTouchAvailable: Bool {
        return view.traitCollection.forceTouchCapability == .available
  }

Một khi chúng ta biết chúng ta có thể sử dụng 3D Touch, chúng ta có thể bắt đầu thực hiện chức năng được cung cấp bởi người dùng.

Vị trí tốt nhất trong mã để phát hiện giá trị của lực tác động là phương pháp touchesMoved. Trong ví dụ này, mình đã thêm đối tượng UIView đơn giản sẽ được thay đổi kích thước (thu nhỏ) dựa trên lực mà chúng ta đang tương tác với đối tượng UIView.

override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesMoved(touches, with: event)
        
        if let touch = touches.first {
         
            guard is3DTouchAvailable, circleView.frame.contains(touch.location(in: view)) else { return }
            
            let maximumForce = touch.maximumPossibleForce
            let force = touch.force
            let normalizedForce = (force / maximumForce) + 1.0;
                
            let animation = CGAffineTransform(scaleX: normalizedForce, y: normalizedForce)
            square.transform = animation
        }
}

touchesEnd

 override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesEnded(touches, with: event)
        
        square.transform = CGAffineTransform.identity
}

Mô tả ngắn về những gì đang xảy ra ở trên. Chúng ta phải chắc chắn rằng vị trí trên màn hình khi người dùng chạm vào nó, nằm bên trong hình vuông của chúng ta (UIView). Sau đó, chúng ta tính toán lực bình thường và sử dụng nó như là một tỉ lệ cho circleView. Trong touchesEnd, chúng ta cập nhập lại theo tỉ lệ ban đầu.

Peek and pop

Để sử dụng được chức năng peekpop thì viewcontroller phải kế thừa giao thức UIViewControllerPreviewingDelegate, cái mà có chứa hai phương thức :

Đầu tiên là viewControllerForLocation là một phương thức được gọi một khi chúng ta thực hiện lực chạm và ngón tay của chúng ta vẫn chạm vào màn hình.

func previewingContext(_ previewingContext: UIViewControllerPreviewing, viewControllerForLocation location: CGPoint) -> UIViewController? {
        
        guard let favoriteViewController = storyboard?.instantiateViewController(withIdentifier: "favoriteVC"), peekAndPopButton.frame.contains(location)  else { return nil}
        
        favoriteViewController.preferredContentSize = CGSize(width: 0, height: 300.0)
        
        return favoriteViewController
}

Kết quả của hàm này là kích thước nội dung của FavoriteViewController thay đổi, và nó sẽ cho ra kết quả như sau :

Khi chúng ta nhấn ngón tay của chúng ta sâu hơn, phương thức thứ hai viewControllerToCommit sẽ được gọi và màn FavoriteViewController sẽ được hiển thị trên toàn màn hình. Thực hiện chức năng này như sau:

func previewingContext(_ previewingContext: UIViewControllerPreviewing, commit viewControllerToCommit: UIViewController) {
        tabBarController?.selectedIndex = TouchActions.favorite.number
}

Ok, vậy là chúng ta đã đi qua 3 tính năng của 3D Touch.

Như bạn thấy ở trên, việc triển khai các ví dụ về chức năng 3D Touch được thực hiện rất dễ dàng và có thể là một cải tiến tuyệt vời đối với các ứng dụng của bạn.

Bạn có thể xem qua demo nhỏ của mình ở đây


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí