Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 整个视图从左上角开始设置动画_Ios_Swift_Snapkit - Fatal编程技术网

Ios 整个视图从左上角开始设置动画

Ios 整个视图从左上角开始设置动画,ios,swift,snapkit,Ios,Swift,Snapkit,嘿,互联网读者 我正在构建一个小功能,其中我的横幅使用Snapkit和Combine从顶部进行动画制作。在我的viewDidLoad中,我调用setupobservators,它在下面创建了这个发布者 在我的应用程序中,isShown被切换,以便发布者在第一次看到视图时触发,这不仅会导致横幅,而且会使整个视图从左上角0,0位置进入动画 我知道这是因为我正在调用self.view.layoutifneed(),我只是想知道如何缓解这种情况,以便在没有动画的情况下加载视图,然后显示横幅 谢谢

嘿,互联网读者

我正在构建一个小功能,其中我的横幅使用Snapkit和Combine从顶部进行动画制作。在我的
viewDidLoad
中,我调用
setupobservators
,它在下面创建了这个发布者

在我的应用程序中,
isShown
被切换,以便发布者在第一次看到视图时触发,这不仅会导致横幅,而且会使整个视图从左上角0,0位置进入动画

我知道这是因为我正在调用
self.view.layoutifneed()
,我只是想知道如何缓解这种情况,以便在没有动画的情况下加载视图,然后显示横幅

谢谢

    public override func viewDidLoad() {
        super.viewDidLoad()

        setupObservers()

        viewStore.send(.viewDidLoad)
    }

从动画块中设置常量

self.banner.snp.updateConstraints {
    if isShown {
         self.topConstraint.update(offset: 0)  
    } else {
         self.topConstraint.update(offset:-Metrics.bannerHeight)
    }
}  
UIView.animate(withDuration: Metrics.animationDuration, delay: 0, options: .curveEaseInOut) { 
    self.view.layoutIfNeeded() 
}

不幸的是,这仍然会导致整个视图从左上角进入动画创建约束一次并将其设置为常量。仅请参见edittopConstraint不是典型的
NSLayoutConstraint
,它是SnapKit的
ConstraintMacerEditable
类型之一,没有
常量
属性。很遗憾,这不起作用。请参见编辑…………谢谢。我也发现了这一点。它仍然在动画中的整个视图,而不仅仅是横幅,然而,很高兴看到你在这里从更好的编程!但是无论如何,请在保护self.initLoadFinished之后首先尝试
self.view.layoutifneed()
,这样所有内容都会被布局。然后,照@Sh_Khan下面说的做。哈,谢谢你。小世界
self.banner.snp.updateConstraints {
    if isShown {
         self.topConstraint.update(offset: 0)  
    } else {
         self.topConstraint.update(offset:-Metrics.bannerHeight)
    }
}  
UIView.animate(withDuration: Metrics.animationDuration, delay: 0, options: .curveEaseInOut) { 
    self.view.layoutIfNeeded() 
}