gpt4 book ai didi

ios - 更新屏幕外的 UILabels 导致它们返回 "Snap"返回

转载 作者:可可西里 更新时间:2023-11-01 02:16:18 24 4
gpt4 key购买 nike

背景信息

我正在构建一个微型秒表应用程序。它由一个带有显示时间标签的主视图和两个按钮组成:开始和停止。
开始按钮激活 NSTimers,然后调用计算时间的方法,然后相应地更新标签。停止按钮只是使计时器无效。

在右上角,有一个箭头按钮,可以将所有 UI 元素向左移动并显示菜单。当计时器没有运行并且标签没有被更新时,这很有效。

问题

但是,当运行计时器并因此同时更新标签时,在动画开始后不久,所有内容都会快速回到之前的位置。当使用停止按钮使计时器无效时,动画再次正常工作。

演示

Demo of the issue

代码

toggleMenu()

中的

动画

UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 0.5, options: .CurveEaseOut, animations: {
if self.arrow.frame.origin.x >= screenBounds.width/2 {
//if menu is NOT visible (mainView ON-SCREEN, menu right)
for element in self.UIElements {element.frame.origin.x -= screenBounds.width}
self.arrow.frame.origin.x = 0
self.arrow.transform = CGAffineTransformMakeRotation(CGFloat(-M_PI))
} else {
//if menu IS visible (mainView left, menu ON-SCREEN)
for element in self.UIElements {element.frame.origin.x += screenBounds.width}
self.arrow.frame.origin.x = screenBounds.width-self.arrow.frame.width
self.arrow.transform = CGAffineTransformMakeRotation(CGFloat(0))
}
}, completion: nil)

更新标签 在计时器调用 updateTime()

let currentTime = NSDate.timeIntervalSinceReferenceDate()
var elapsedTime: NSTimeInterval = currentTime - startTime

let hrs = UInt8(elapsedTime/3600)
elapsedTime -= NSTimeInterval(hrs)*3600
let mins = UInt8(elapsedTime/60)
elapsedTime -= NSTimeInterval(mins)*60
let secs = UInt8(elapsedTime)
elapsedTime -= NSTimeInterval(secs)

let strHrs = String(format: "%02d", hrs)
let strMins = String(format: "%02d", mins)
let strSecs = String(format: "%02d", secs)

//update time labels
self.time.text = "\(strHrs):\(strMins)"
self.secs.text = "\(strSecs)"

尝试

没有运气,我试过......

  • ...动画结束后隐藏标签
  • ...在动画完成后动画化/隐藏所有元素的 super View (clipsToBounds 设置为 true)

注意事项

我想...

  • ...注释掉正在更新标签的行“修复”了问题
  • ...动画 UI 元素仅移动几个像素(如 100 像素)会导致同样的问题,这意味着该问题发生在屏幕上和屏幕外


有什么想法吗?
提前致谢!

最佳答案

当您更新标签时,Auto Layout 会运行并将您的 UI 元素放回到它们的约束指定的位置。您不应更改受自动布局 控制的对象的框架,否则您会得到意想不到的结果。

不是更新 UI 元素的 origin.x,而是为水平放置它们的 NSLayoutContraints 创建 @IBOutlet,然后更新约束的 constant 属性并在动画循环中调用 self.view.layoutIfNeeded()

使所有 UI 元素成为顶级 UIView 的 subview 可能更容易,然后您只需更新将 UIView 水平放置的约束以将其移出屏幕。

关于ios - 更新屏幕外的 UILabels 导致它们返回 "Snap"返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38229038/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com