【问题标题】:Swift : show subview with animation on click of buttonSwift:单击按钮时显示带有动画的子视图
【发布时间】:2016-07-20 05:55:24
【问题描述】:

当用户按下按钮时,我想让子视图隐藏为假。此子视图在设计时设置了 60% 的不透明度。子视图应该从按钮所在的位置开始以流畅的动画出现。

以下是我尝试过的代码:

 @IBAction func moreOptions_Clicked(sender: AnyObject) { print("moreOptions clicked")

  UIView.animateWithDuration(0.9, delay: 0.2, options: UIViewAnimationOptions.TransitionCurlDown, animations: {
      //self.objMoreView.hidden = false
      // Show view with animation
  }, completion: nil)}

这没有奏效。有什么解决办法吗?

【问题讨论】:

  • 试试alpha = 0然后在完成时隐藏它?

标签: ios swift xcode animation uiviewanimation


【解决方案1】:

将您的.hidden = false 替换为.alpha = 1,它应该可以工作;)

解释:

如果您想为 UI 对象的“可见性”设置动画:

将您的 alpha 初始值设置为 0(您的对象将被“隐藏”) 在动画期间,将其值设置为 1UIView.animateWithDuration() 将通过在持续时间内传递所有值来动画 0 -> 1 的变化。您将有一个动画逐步显示您的子视图。

如果您想为 UI 对象的位置或大小设置动画:

yourObject.frame.size.(height or width)

yourObject.frame.origin.(x or y)

希望我能帮到你。

【讨论】:

  • 我更新了我的答案,也许它可以更详细。
  • 对于有同样问题的会员,如果答案是解决方案,请不要犹豫,验证它。它可以帮助他们;p
  • 这有帮助,但它完全显示,即子视图是完整的。我希望子视图慢慢地从右上角出现,并且应该在一段时间内完成它(比如 10 秒)
  • 好的,所以你必须更精确!你究竟是如何想象你的动画的?通过改变框架?职位?只需考虑 UIView.animateWithDuration() 在您定义的时间内更新您的视图属性。所以,在这个函数中,如果你想将你的视图(例如)从右边移动到左边,你只需要设置 yourSubview.frame.origin.x 属性:)
  • 在你的情况下(如果我理解正确的话),你的初始值应该是:x = self.view.frame.size.width --- y = self.view.frame.origin.y .然后,在你的动画过程中,你用你需要的值来设置它们。
【解决方案2】:

您也可以使用约束来执行此操作。 例如,在您的视图中为您的按钮设置一个顶部约束。 保留对该约束的引用:

self.whatEverTopButtonConstraint = NSLayoutConstraint(item: self.whatEverButton, attribute: .Top, relatedBy: .Equal, toItem: self.whatEverSubView, attribute: .Top, multiplier: 1, constant: 0)
self.whatEverSubView.addConstraint(self.whatEverTopButtonConstraint)

然后,每当您想让按钮出现时,将此约束的常量设置为您需要的任何值。 最后,只需使用漂亮的弹簧效果对其进行动画处理。结果会是这样的:

    func showButton () {
        self.whatEverTopButtonConstraint.constant = 20 //custom the right constraint constant here
        UIView.animateWithDuration(0.9, delay: 0.2, usingSpringWithDamping: 0.8, initialSpringVelocity: 1, options: .CurveEaseInOut, animations: {
        self.whatEverButton.alpha = 1
        self.whatEverSubView.layoutIfNeeded()
        }, completion: nil)
    }

当然,这段代码只会对位置进行动画处理。如果你想让它在同一时刻水平移动,例如从右边缘设置一个约束,然后在调用动画之前设置它的常量;)

【讨论】:

    猜你喜欢
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多