UIView.animateWithDuration不动画Swift(再次)

Dru*_*man 22 animation uiviewanimation uiviewanimationtransition ios swift

注意:我已经检查了以下堆栈溢出问题:

27907570,32229252,26118141,31604300

我想要做的就是当一个按钮附带的IBAction调用时,在视图中淡化动画(通过alpha).然后在视图上的按钮被击中时反转.

我的皱纹可能是我在故事板视图中使用ViewDock上的辅助视图.视图在viewDidLoad时被添加到子视图中,其中框架/边界设置为与超级视图相同(用于完全停留)

这是作为叠加视图完成的原因,因为它是一个教程指示器.

结果(就像许多其他列出这个问题的人一样)是视图(和包含的控件)只是立即出现并立即消失.没有褪色.

我已尝试使用延迟,带有和不带完成,带有转换的animationWithDuration,甚至以旧的UIView.beginAnimations启动.

什么都行不通.建议热烈欢迎.

代码与我可以做到的一样简单:
编辑:将代码扩展到与
Edit2: TL 相关的所有内容; DR除了UIViewAnimateWithDuration之外,其他任何东西都可以工作,它似乎忽略了块和持续时间,只是直接运行内联代码UI更改.解决这个问题得到了赏金

@IBOutlet var infoDetailView: UIView! // Connected to the view in the SceneDock

override func viewDidLoad() {
    super.viewDidLoad()

    // Cut other vDL code that isn't relevant

    setupInfoView()
}

func setupInfoView() {
    infoDetailView.alpha = 0.0
    view.addSubview(infoDetailView)
    updateInfoViewRect(infoDetailView.superview!.bounds.size)
}

func updateInfoViewRect(size:CGSize) {
    let viewRect = CGRect(origin: CGPointZero, size: size)

    infoDetailView.frame = viewRect
    infoDetailView.bounds = viewRect

    infoDetailView.layoutIfNeeded()
    infoDetailView.setNeedsDisplay()
}

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
    super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)
    updateInfoViewRect(size)
}

func hideInfoView() {
    AFLog.enter(thisClass)
    UIView.animateWithDuration(
        2.0,
        animations:
        {
            self.infoDetailView.alpha = 0.0
        },
        completion:
        { (finished) in
            return true
        }
    )
    AFLog.exit(thisClass)
}

func showInfoView() {
    AFLog.enter(thisClass)
    UIView.animateWithDuration(
        2.0,
        animations:
        {
            self.infoDetailView.alpha = 0.75
        },
        completion:
        { (finished) in
            return true
        }
    )
    AFLog.exit(thisClass)
}

// MARK: - IBActions

@IBAction func openInfoView(sender: UIButton) {
    showInfoView()
}

@IBAction func closeInfoView(sender: UIButton) {
    hideInfoView()
}
Run Code Online (Sandbox Code Playgroud)

请注意,我从以下开始:

func showInfoView() {
    UIView.animateWithDuration(2.0, animations: { () -> Void in
        self.infoDetailView.alpha = 0.75
    })
}

func hideInfoView() {
    UIView.animateWithDuration(2.0, animations: { () -> Void in
        self.infoDetailView.alpha = 0.00
    })
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rko 46

如果infoDetailView处于自动布局约束下,则需要 animateWithDuration 视图上调用layoutIfNeeded :

func showInfoView() {
    self.view.layoutIfNeeded() // call it also here to finish pending layout operations
    UIView.animate(withDuration: 2.0, animations: {
        self.infoDetailView.alpha = 0.75
        self.view.layoutIfNeeded()
    })
}
Run Code Online (Sandbox Code Playgroud)

从理论上讲,如果你只是改变了阿尔法值,但是这应该没有必要,也许这可能是在这种情况下的问题.

  • 这是一个关键的提示,你必须在superview**上调用布局**,而不是在有问题的视图上! (3认同)

Sul*_*han 14

我能看到几件奇怪的事情,

首先,删除:

infoDetailView.layoutIfNeeded()
infoDetailView.setNeedsDisplay()
Run Code Online (Sandbox Code Playgroud)

通常您不需要手动调用这些方法,除非您确切知道自己在做什么.

此外,当您更改大小时:

infoDetailView.frame = viewRect
infoDetailView.bounds = viewRect
Run Code Online (Sandbox Code Playgroud)

你永远不需要同时设置boundsframe.刚设置frame.

此外,您应该通过设置确保视图实际上不会忽略该帧:

infoDetailView.translatesAutoresizingMaskIntoConstraints = true
Run Code Online (Sandbox Code Playgroud)

只需设置自动调整大小掩码,而不是重置帧:

infoDetailView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
Run Code Online (Sandbox Code Playgroud)

导致:

override func viewDidLoad() {
    super.viewDidLoad()

    // Cut other vDL code that isn't relevant

    setupInfoView()
}

func setupInfoView() {
    infoDetailView.alpha = 0.0
    infoDetailView.translatesAutoresizingMaskIntoConstraints = true
    infoDetailView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
    infoDetailView.frame = view.bounds
    view.addSubview(infoDetailView)
}

func hideInfoView() {
  ...
}
Run Code Online (Sandbox Code Playgroud)

我认为这实际上应该有所帮助,因为即时动画通常与尺寸问题有关.

如果问题仍然存在,则应检查infoDetailView动画中的对象infoDetailView是否与添加到控制器的对象相同.


spe*_*.sm 8

对于希望在视图加载时立即开始动画的其他人...

如果您调用UIView.animate(...)inside动画将不起作用viewDidLoad。相反,它必须从viewDidAppear函数中调用。

override func viewDidAppear(_ animated: Bool) {
    UIView.animate(withDuration: 3) {
        self.otherView.frame.origin.x += 500
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 1

使用此代码:

雨燕2

UIView.animateWithDuration(0.3, animations: { () -> Void in
    self.infoDetailView.alpha = 0.0 
})
Run Code Online (Sandbox Code Playgroud)

斯威夫特 3、4、5

UIView.animate(withDuration: 0.3, animations: { () -> Void in
    self.infoDetailView.alpha = 0.0 
})
Run Code Online (Sandbox Code Playgroud)

  • 这是我在进行更改之前开始的地方。效果一样。没有褪色只是出现。 (2认同)