2016-04-29 21 views
5

Tôi đang trải qua dao động tác chuyển động bằng cách sử dụng đoạn mã saubất ngờ dao động hiệu quả chuyển động trong tvOS

import UIKit 

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 
    var window: UIWindow? 

    func application(application: UIApplication, 
        didFinishLaunchingWithOptions launchOptions: 
               [NSObject: AnyObject]?) -> Bool { 
     self.window = UIWindow(frame: UIScreen.mainScreen().bounds) 
     self.window!.rootViewController = ExampleController() 
     self.window!.makeKeyAndVisible() 
     return true 
    } 
} 
class ExampleController: UIViewController { 
    override func viewDidLoad() { 
     super.viewDidLoad() 

     let redView = UIView(frame: CGRect(x: 200, y: 200, 
              width: 800, height: 500)) 
     redView.backgroundColor = UIColor.redColor().colorWithAlphaComponent(0.5) 
     self.view.addSubview(redView) 

     let effect = UIInterpolatingMotionEffect(keyPath: "center.x", 
               type: .TiltAlongHorizontalAxis) 
     effect.minimumRelativeValue = -100 
     effect.maximumRelativeValue = 100 

     let effectGroup = UIMotionEffectGroup() 
     effectGroup.motionEffects = [effect] 

     redView.motionEffects = [effectGroup] 
    } 
} 

dẫn đến hành vi sau cả Simulator và trên Apple mới TV

Is có cách nào để tránh dao động?

+1

Bạn đã thử trên một thiết bị thực? –

+0

Tôi đã thử nghiệm mã và tôi có thể tái tạo hoàn toàn mã, tuy nhiên có vẻ như dao động đã có trong dữ liệu nghiêng nên tôi cho rằng nó được tạo khi chạm được chuyển thành độ nghiêng mô phỏng. Bạn nên thử nó trên thiết bị thực. – Sulthan

+0

Có, cùng một hiệu ứng trên trình mô phỏng và trên Apple TV mới. – Andrei

Trả lời

4

Tôi đã thử mã của bạn trong mô phỏng, in ngang offset:

public class MyMotionEffect : UIInterpolatingMotionEffect { 
    public override func keyPathsAndRelativeValuesForViewerOffset(viewerOffset: UIOffset) -> [String : AnyObject]? { 
     print("\(viewerOffset.horizontal)") 

     return super.keyPathsAndRelativeValuesForViewerOffset(viewerOffset); 
    } 
} 

Sau một thời gian tôi có thể tái tạo các dao động. Kết quả (ngang) bù đắp có biểu đồ sau:

enter image description here

Bạn có thể thấy sự dao động đã có mặt trong nghiêng. Có vẻ như thiết bị đang tạo hai tilts cùng một lúc.

Một giải pháp là thêm heuristics (so sánh giá trị offset với hai giá trị trước đó và bỏ qua nếu có thay đổi dấu hiệu hoặc bỏ qua các thay đổi đột ngột. Không có giải pháp nào là hoàn hảo). Giải pháp tốt nhất có thể là sử dụng Core Motion trực tiếp và tránh hoàn toàn các biến đổi tự nhiên. Hoặc sử dụng nó với khoảng cách nhỏ hơn vì sau đó dao động sẽ không hiển thị.

+0

Vấn đề là thiết bị thực (Apple TV mới) có cùng một vấn đề. – Andrei

+0

Tôi tin rằng hai hình động (từ trái sang phải và từ phải sang trái) đang chạy cùng một lúc và cập nhật vị trí xem lần lượt. Nó không phải là gia tốc kế/con quay hồi chuyển liên quan. – Andrei

+1

@Andrei Sau đó, bạn có thể thêm một số chẩn đoán sẽ bỏ qua những thay đổi quá lớn. Hoặc bạn có thể thêm heuristics phát hiện sự thay đổi của dấu hiệu. Ví dụ, bạn luôn có thể lưu offset và không truyền nó cho đến khi sự kiện tiếp theo xuất hiện. Nếu hai bù có các dấu hiệu khác nhau, bạn có thể bỏ qua chúng và đợi cho sự kiện tiếp theo. Hoặc bạn chỉ có thể sử dụng một trong số họ. Cả hai cách tiếp cận đều có vấn đề. Tôi cảm thấy đây là một lỗi trong thiết bị bởi vì điều này thực sự không nên xảy ra. – Sulthan

0

Tôi cũng đã thử mã của bạn. Đây không phải là vấn đề về trình mô phỏng. Sự cố chỉ xảy ra khi bạn thay đổi hướng chạm quá nhanh. Các UIInterpolatingMotionEffect bắt đầu một chuyển động mới trước khi hoàn thành để nội suy trước đó. Vì vậy, có hai chuyển động tác động lên quan điểm của bạn đồng thời.

Các vấn đề liên quan