【问题标题】:How to fix this old frame glitch appearing when animating view?如何修复动画视图时出现的这个旧帧故障?
【发布时间】:2019-09-22 08:34:03
【问题描述】:

我有一个包含分页器视图 (FSPagerView) 的标题视图,其中有一个项目 (FSPagerViewCell),其中包含条形图、2019、年回顾文本。我正在尝试使用这样的代码在某些时候缩小 Header:

private func setSelfHeightAnimated(height: CGFloat)
{
    UIView.animate(withDuration: 0.2, animations: {
        self.selfHeightAnchor.constant = height
        self.superview?.layoutIfNeeded()
    })
}

private func setPagerHeightAnimated(height: CGFloat)
{
    UIView.animate(withDuration: 0.2, animations: {
        self.pagerHeightAnchor.constant = height
        self.layoutIfNeeded()
//            self.pagerView.layoutIfNeeded()
//            self.pagerView.layoutSubviews()
//            self.pagerView.cellForItem(at: 0)?.layoutIfNeeded()
//            self.pagerView.cellForItem(at: 0)?.setNeedsDisplay()
//            self.superview?.layoutIfNeeded()
//            self.setNeedsDisplay()
//            self.pagerView.setNeedsDisplay()
    })
}

但是,旧的帧故障非常明显。可能缺少什么?这是视频:https://streamable.com/owsdi

【问题讨论】:

    标签: ios swift animation uiview uiviewanimation


    【解决方案1】:

    您有第一个布局和一个第二个布局,以及一个从第一个布局到第二个的动画。
    目前,第一个布局淡出,第二个布局在动画期间淡入,这会给你“小故障”。
    我假设您想要实现的是:
    - 顶部(历史,2019,年回顾)应保持高度,并且
    - 只有下面的列应该收缩/扩展,而下面的表格向上或向下滑动。
    一个解决方案可能是只为包含 2 列的子视图的高度设置动画。
    如果标题视图设置为对其内容采用其高度,那么我希望显示所需的效果而不会出现故障。

    编辑:

    如果您确实必须将上半部分作为一个整体进行动画处理,那么一种可能性可能是(我认为这很难看)在动画开始之前立即将 History、2019 和 Year 的 alpha 值设置为 0。然后这些文本只会淡入淡出,因此可以避免在不同位置出现双图像的故障。

    【讨论】:

    • 2019 年,年度回顾文本和列在 FSPagerView 内。我必须调整 FSPagerView 的大小,否则会一团糟。还有什么办法?
    • 在动画的每一帧中重新渲染整个 FSPagerView 的解决方案是什么?这样我就不需要任何这种 hack bs
    • 我对@9​​87654321@ 没有任何经验。但在我看来,您希望视图的一部分(上部 3 个文本)保持未缩放,并且在动画期间只有下部(列)缩放。如果是这样,我认为您必须在某处指定此行为,例如正如我在回答中所建议的那样,具有不同的约束条件。
    • 您的回答不够普遍。即使你不熟悉 FSPagerView,我如何设置一个简单的 UIView 来在动画的每一帧上重新渲染自己?
    • 那我希望有人有更好的主意。祝你好运!
    【解决方案2】:

    尝试这样避免故障。

    private func setSelfHeightAnimated(height: CGFloat)
    {
        self.selfHeightAnchor.constant = height
    
        UIView.animate(withDuration: 0.2, animations: {
            self.layoutIfNeeded()
            self.viewDidLayoutSubviews()
        })
    }
    
    private func setPagerHeightAnimated(height: CGFloat)
    {
        self.pagerHeightAnchor.constant = height
    
        UIView.animate(withDuration: 0.2, animations: {
            self.layoutIfNeeded()
            self.viewDidLayoutSubviews()
        })
    }
    

    【讨论】:

    • 这只是语法。为避免出现故障,请在动画前后保持约束更改。
    猜你喜欢
    • 2022-12-04
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多