我想通过使用加速度计数据来改变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")
}
}
答案 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))