ios - 调用 layoutIfNeeded 后 View 不会立即显示

原文 标签 ios swift autolayout snapkit

我正在尝试使用自动布局(在 SnapKit 的帮助下)制作一个简单的从顶部向下滑动的动画。

下面是我用来生成 View 、设置其约束并强制重新加载(从而显示)所述 View 的代码。在相同的代码中,我将顶部约束更改为不同的值并调用 layoutIfNeeded在动画 block 中。

然而发生的情况是, View 显示在预期位置,没有任何动画。

这是在短暂延迟后在方法中调用的代码(用于其他目的):

DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(4), execute: {
    self.view.addSubview(view)
    view.backgroundColor = .black

    view.snp.makeConstraints { (make) -> Void in
        make.left.right.equalToSuperview()
        make.height.equalTo(200)
        make.bottom.equalTo(self.view.snp.top) // Pin view to top to prepare slide-down animation
    }

    view.setNeedsLayout()
    view.layoutIfNeeded()

    view.snp.updateConstraints { (make) -> Void in
        make.bottom.equalTo(self.view.snp.top).offset(200)
    }

    view.setNeedsLayout()

    UIView.animate(withDuration: 5, animations: {
        view.layoutIfNeeded()
    })
})

最佳答案

感谢 In Swift, how do I animate a UIView with auto-layout like a page sliding in?我找到了罪魁祸首。

虽然我不是 100% 理解这是为什么,但是 layoutIfNeeded需要从父 View 调用,而不是 View 本身。

所以打电话self.view.layoutIfNeeded()是正确的方法。请注意 view当前正在添加 UIView , 而 self.view是 super View ,其中 view正在添加到。

关于ios - 调用 layoutIfNeeded 后 View 不会立即显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42892491/

相关文章:

ios - UIScreen.mainScreen()。bounds始终为零

ios - iPad应用程序左右两侧的空格

iphone - 为布局约束添加优先级

ios - 如何在不使用 contentOffset 的情况下检查 UITableView 中第一行隐藏了多少?

ios - Card.io扫描信用卡后,iOS Phonegap应用程序崩溃

ios - Cocoapod库问题:DTCoreText

ios - 导航栏的景观 View 问题

swift - 将数据从 UIKit 传递到 SwiftUI(容器 UIHostingController)

swift - 为什么我在 ViewController.swift 文件中看不到要添加到 Storyboard 的对象?

objective-c - Interface Builder "locking"对象到屏幕边缘