Swift加速度计数据不会更新UILabel阴影

时间:2014-10-23 12:29:22

标签: ios xcode 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")
    }

}

2 个答案:

答案 0 :(得分:3)

问题是您正在接收后台队列的更新,并且除了主队列之外,您无法更新UI元素。最简单的解决方案是简单地将您传递给motionManager.startAccelerometerUpdatesToQueue的队列更改为主队列:

let queue = NSOperationQueue.mainQueue()

motionManager.startAccelerometerUpdatesToQueue(queue, withHandler: ...

然而,documentation州:

  

因为处理过的事件可能会以很高的速度到达,所以使用   不建议使用主操作队列。

因此,您应该将accelerometerUpdateInterval设置为默认值以外的其他值。当然,这取决于您的应用程序,但1.0 / 30.0之类的内容可能是一个很好的价值。

答案 1 :(得分:0)

您正在更改图层的shadowOffset

尝试这样做:

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