2014-10-23 2 views
0

Я хочу изменить положение тени UILabel с помощью данных акселерометра. Я уже успешно вижу данные акселерометра на выходе консоли, но тень не хочет обновлять собственную позицию. Все, что у меня есть, - это другое теневое положение при запуске приложения.Данные акселерометра Swift не обновляют тень UILabel

Мне нужно обновить его каждую секунду или часто.

код о применении теневой позиции является:

self.bigLabel.layer.shadowOffset = CGSize(width: (14 - data.acceleration.y*5), height: (14 - data.acceleration.z*5)) 

Что я делаю неправильно?

@IBOutlet weak var bigLabel: UILabel! 

override func viewDidLoad() { 
    super.viewDidLoad() 


    self.bigLabel.layer.shadowColor = UIColor(red: 61/255, green: 88/255, blue: 126/255, alpha: 0.8).CGColor 
    self.bigLabel.layer.shadowRadius = 5 
    self.bigLabel.layer.shadowOpacity = 1 


    if motionManager.accelerometerAvailable{ 
     let queue = NSOperationQueue() 


     motionManager.startAccelerometerUpdatesToQueue(queue, withHandler: 
      {(data: CMAccelerometerData!, error: NSError!) in 

       self.bigLabel.layer.shadowOffset = CGSize(width: (14 - data.acceleration.y*5), height: (14 - data.acceleration.z*5)) 

       println("X = \(data.acceleration.x)") 
       println("Y = \(data.acceleration.y)") 
       println("Z = \(data.acceleration.z)") 

      } 

     ) 
    } else { 
     println("Accelerometer is not available") 
    } 

} 

ответ

3

Проблема заключается в том, что вы получаете обновления на фоне очереди, и вы не можете обновить элементы пользовательского интерфейса, от чего-либо, кроме основной очереди. Самым простым решением является просто изменить очередь вы проходящее в motionManager.startAccelerometerUpdatesToQueue в основную очередь:

let queue = NSOperationQueue.mainQueue() 

motionManager.startAccelerometerUpdatesToQueue(queue, withHandler: ... 

Однако documentation состояния:

Поскольку обработанные события могут прибыть на высокой скорости, использование основной рабочей очереди не рекомендуется.

Таким образом, вы должны, вероятно, установить accelerometerUpdateInterval на что-то другое, кроме значения по умолчанию. Конечно, это будет зависеть от вашего приложения, но что-то вроде 1.0/30.0 может быть полезным для начала.

0

Вы меняете слой shadowOffset.

Попробуйте сделать это:

self.bigLabel.shadowOffset = CGSize(width: (14 - data.acceleration.y*5), height: (14 - data.acceleration.z*5))

Смежные вопросы