我正在创建一个具有UIImageView和UITextView的应用程序。我从服务器获取文本和图像,但是当我向UITextView分配大量文本时,UITextView不会滚动。很少有人开始使用大量文本滚动。我不确定我做错了什么?但大多数时候它不会滚动并且看起来很冷冻。我检查了输出窗口,我没有看到任何约束被破坏。
func locationManager(manager: CLLocationManager!, didRangeBeacons beacons: [AnyObject]!, inRegion region: CLBeaconRegion!) {
if beacons.count == 0 {
return
}
for beacon in beacons as! [CLBeacon] {
// we are only interested in beacons that are near or immediate!
if beacon.proximity == .Near || beacon.proximity == .Immediate {
let closestTourBeacon = beaconByMajorAndMinorId(beacon.major, minorId: beacon.minor)
if self.lastBeacon == nil {
self.lastBeacon = closestTourBeacon
}
else if isEqualToLastBeacon(closestTourBeacon)
{
continue
}
else {
self.lastBeacon = closestTourBeacon
}
dispatch_async(dispatch_get_main_queue(), { () -> Void in
// vibrate the phone
//AudioServicesPlayAlertSound(SystemSoundID(kSystemSoundID_Vibrate))
println("Assinging the text property")
self.textTextView.text = closestTourBeacon.text <<=== THIS LINE
self.title = closestTourBeacon.title
self.photoImageView.load(closestTourBeacon.imageURL!)
let originalFrame = self.photoImageView.frame
self.photoImageView.center = CGPointMake(self.photoImageView.center.x, -100)
UIView.animateWithDuration(1.0, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1.0, options: UIViewAnimationOptions.TransitionNone, animations: { () -> Void in
self.photoImageView.frame = originalFrame
}, completion: { (finished :Bool) -> Void in
})
})
}
}
}
更新:我还注意到,当应用首次启动UITextView时,即使有大量要滚动的文本,UITextView也会完全冻结。之后,如果我继续尝试滚动UITextView并使用新数据获取和setText,它将从冻结状态开始并开始滚动而没有任何问题。
答案 0 :(得分:1)
如果冻结将其从主队列中取出。
dispatch_queue_t myQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
dispatch_async(myQueue, ^{
//update text
});
//Release queue
dispatch_release(myQueue);
同时查看https://www.youtube.com/watch?v=GvsEhDEGO_k我认为您的问题可能是更新太快
答案 1 :(得分:0)
感谢所有回复!虽然我没有找到它为什么会发生,但我能够找到一个解决方案。我现在强制它在分配文本后滚动。
self.textTextView.text = closestTourBeacon.text
// scroll to get out of the frozen mode
self.textTextView.scrollRangeToVisible(NSMakeRange(1, 1))