Swift - UIScrollView 滚动动画在 viewDidLoad() 中不起作用

Posted

技术标签:

【中文标题】Swift - UIScrollView 滚动动画在 viewDidLoad() 中不起作用【英文标题】:Swift - UIScrollView scroll animation not working in viewDidLoad() 【发布时间】:2021-02-08 06:49:54 【问题描述】:

我正在使用带有 Xcode 12.3 的 Storyboard 开发一个应用程序,我需要在视图加载到屏幕上以及当用户从另一个视图控制器返回到该视图时立即为 scrollView 的滚动设置动画。在我看来,如果我从 viewDidLoad() 函数内或从展开 segue 时调用的函数滚动视图,动画将不起作用。相反,视图出现在屏幕上(在这两种情况下),并且滚动视图已经在相应的位置滚动。本质上,最终结果已实现,但滚动动画似乎被忽略或不执行。

有人可以帮忙解决这个问题吗?

这是我在这两种情况下都演示问题的简单代码:

override func viewDidLoad 
    super.viewDidLoad()

    // ...

    scrollView.setContentOffset(CGPoint(x: xOffset, y: yOffset), animated: true)



@IBAction func myUnwindAction(unwindSegue: UIStoryboardSegue) 
    let segue = unwindSegue.source as! AnotherViewController

    // ...

   scrollView.setContentOffset(CGPoint(x: xOffset, y: yOffset), animated: true)

但是,如果我将滚动代码放在测试按钮的 IBAction 中,并在视图加载后单击此按钮,则视图会平滑地为滚动设置动画并且没有任何问题 - 这是此函数的代码:

@IBAction func testButton(_ sender: Any) 
    scrollView.setContentOffset(CGPoint(x: xOffset, y: yOffset), animated: true)

非常感谢。

【问题讨论】:

1.如果您想“滚动到某个区域”,请使用scrollRectToVisible(:animated)。 contentOffset 是您的内容到滚动框架的偏移量,与“滚动”不同。 2. viewDidLoad 在 UIView 生命周期的早期被调用,你可以把它当作“viewDidBuild”。您至少应该瞄准“viewDidAppear”,即您的视图可见。 【参考方案1】:

需要在viewDidAppear中使用

你应该谷歌“查看控制器生命周期”

var isFirst = true
override func viewDidAppear(_ animated: Bool) 
    super.viewDidAppear(animated)
    if isFirst 
        isFirst = false
        scrollView.setContentOffset(CGPoint(x: xOffset, y: yOffset), animated: true)
    

【讨论】:

以上是关于Swift - UIScrollView 滚动动画在 viewDidLoad() 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当另一个 UIScrollView 滚动时停止动画 UIScrollView

IOS。当 UIScrollView 滚动时应用另一个滚动动画[关闭]

自动滚动 UIScrollView,允许用户中断动画

UIScrollView 滚动时为对象设置动画

当我滚动 UIScrollView 时,连接到计时器的动画和滚动视图内的动画视图突然停止滴答作响

滚动时将功能分配给 UIScrollView (Swift)