Làm quen với 3D Touch bằng ứng dụng cân điện tử đơn giản

Cùng với sự ra mắt của iPhone 6s và 6s Plus, Apple đã giới thiệu một phương thức tương tác với điện thoại hoàn toàn mới: 3D Touch. Để hiểu hơn về 3D Touch, chúng ta sẽ thử xây dựng một ứng dụng cân điện tử đơn giản.

Để bắt đầu, bạn có thể download sẵn project template hoặc có thể tự tạo 1 project mới với 1 View Controller trong đó có 2 UILabel làm nhiệm vụ thông báo và 1 UIImageView để hiển thị vùng đặt vật cần cân. Thực tế thì bạn không cần UIImageView luôn cũng được.

Project start.png

Như các bạn có thể thấy, chúng ta sẽ có 2 UILabel, 1 label cho title và 1 lable hiển thị % của lực tiếp xúc với màn hình iPhone.

Trên iPhone 6s và 6s Plus, object UITouch có thêm hai thuộc tính CGFloat mới là forcemaximumPossibleForce. force biểu diễn độ mạnh của một touch. maximumPossibleForce thể hiện lực tối đa của một touch.

Khi người dùng chạm/touch vào màn hình, touchesBegan được gọi, theo sau bởi touchesMoved nếu người dùng di chuyển các ngón trên màn hình và touchedCanceled hoặc touchesEnded được gọi phụ thuộc vào tình huống. Đối với mục đích của chúng ta, touchesMoved là method cần duy nhất. touchesMoved có 2 tham số là touchesevent. touches là 1 set của các đối tượng UITouch. Sẽ chỉ có 1 đối tượng UITouch ở trong touches nhưng cẩn thận không bao giờ là thừa, chúng ta nên kiểm tra touches.first không phải nil trước khi tiếp tục xử lý. Thêm method sau vào trong ViewController.swift:

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first {
        if #available(iOS 9.0, *) {
            if traitCollection.forceTouchCapability == UIForceTouchCapability.Available {
                // 3D Touch capable
            }
        }
    }
}

Ở đây, chúng ta cần kiểm tra xem thiết bị/device có hỗ trợ 3D Touch hay không trước khi xử lý để tránh hiển thị những thông tin sai lầm cho người dùng bởi các thiết bị cũ hơn như iPhone 6 trở về trước chưa hỗ trợ 3D Touch.

Ngoài ra bạn cũng sẽ thấy chúng ta có kiểm tra cả hệ điều hành của thiết bị phải là 9.0 trở lên với cú pháp #available mới được giới thiệu từ Swift 2.0. Mặc dù việc kiểm tra này sẽ không cần thiết nếu bạn để deployment target là từ 9.0 trở lên.

1 chú ý nhỏ nữa là ở đây, các bạn có thể sẽ thấy 2 warning của Xcode, 1 là về touch vì chưa được sử dụng và 1 là về #available vì project đã được set deployment target từ 9.0 trở lên (nếu bạn sử dụng template project)

Để lấy được % lực tác động, chúng ta chỉ việc chia lực của touch với lực tối đa, sau đó update lại text của label. Đoạn code của chúng ta sẽ được cập thêm như sau:

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first {
        if #available(iOS 9.0, *) {
            if traitCollection.forceTouchCapability == UIForceTouchCapability.Available {
                // 3D Touch capable
                let force = touch.force/touch.maximumPossibleForce
                forceLabel.text = "\(force)% force"
            }
        }
    }
}

Nếu bạn chạy ứng dụng trên iPhone 6s hoặc 6s Plus bạn sẽ thấy % force khi ấn lên màn hình. Tuy nhiên, vì chúng ta đang làm một ứng dụng cân điện tử nên chúng ta sẽ cần hiển thị số gram của vật đang cân trên iPhone thay vì % lực không có nhiều ý nghĩa cho lắm. Theo như Ryan McLeod thì bộ cảm biến sẽ không cân đươc quá trọng lượng ~ 385g. Như vậy maximumPossibleForce tương ứng với 385g. Bằng việc tính toán đơn giản, chúng ta có thể chuyển đổi % force sang grams. Tất cả tính toán chúng ta phải làm chỉ là nhân % force với 385. Đối với các vật thể nặng hơn 385g, chúng ta sẽ hiển thị lable thành 385+ grams.

Bây giờ update lại method với đoạn code sau:

override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    if let touch = touches.first {
        if #available(iOS 9.0, *) {
            if traitCollection.forceTouchCapability == UIForceTouchCapability.Available {
                if touch.force >= touch.maximumPossibleForce {
                    forceLabel.text = "385+ grams"
                } else {
                    let force = touch.force/touch.maximumPossibleForce
                    let grams = force * 385
                    let roundGrams = Int(grams)
                    forceLabel.text = "\(roundGrams) grams"
                }
            }
        }
    }
}

Bây giờ bạn đã có một ứng dụng cân điện tử rồi đấy. Tuy nhiên, ứng dụng của chúng ta vẫn chưa reset lại trọng lượng của vật sau khi vật được nhấc ra (không chạm vào màn hình nữa). Để khắc phục điều đó, chúng ta sẽ cần xây dựng method touchesEnded như sau:

override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    forceLabel.text = "0 gram"
}

Đến đây, ứng dụng của chúng ta đã hoàn thành, hi vọng các bạn đã hiểu thêm về 3D Touch qua ứng dụng nhỏ này và cùng phát triển thêm nhiều ý tưởng hay ho với 3D Touch. Source code sau khi hoàn thành các bạn có thể down tại đây: Code


All Rights Reserved