【问题标题】:View does not animate视图没有动画
【发布时间】:2015-05-21 20:28:46
【问题描述】:

我有一个视图,它会像抽屉一样从屏幕底部向上移动。但它什么也没做。它只是坐在那里=) 谁能告诉我,为什么会这样?

这是我的代码:

import UIKit

class InfoPopUpVC: UIViewController {
  var superView: UIView!
  var labelText: String!
  let textLabel =  UILabel()
  let height = CGFloat(80)


  override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    UIView.animateWithDuration(0.4, animations: { () -> Void in
      self.view.center.y = 50
    })
  }

override func viewDidLoad() {
  super.viewDidLoad()
  setupTextLabel()
  view.frame = CGRectMake(0, superView.frame.maxY-height, superView.frame.width, height)
  AnimationHelper.blurBackgroundForView(view)
  view.backgroundColor = .greenColor()
  }

func setupTextLabel(){
  textLabel.text = labelText
  textLabel.frame = CGRectMake(0, 0, view.frame.width, view.frame.height)
  textLabel.numberOfLines = 3
  textLabel.textAlignment = .Center

  textLabel.frame.inset(dx: 10, dy: 8)
  textLabel.sizeToFit()
  textLabel.font = UIFont(name: "HelveticaNeue-Light", size: 17)
  textLabel.textColor = .whiteColor()
  view.addSubview(textLabel)
  }
}

【问题讨论】:

  • 你在使用自动布局吗?如果是这样,更改中心和框架不会移动视图。
  • 每当我希望从底部弹出一个弹出窗口以显示一些信息时,都会以编程方式调用 InfoPopUpVC。 PopUp 的 viewController 添加为子视图使用自动布局,但因为它是通过编程方式调用的,所以我无法设置任何约束
  • 不能以编程方式设置约束是不正确的。有一套完整的 API 可用于以编程方式添加约束,并且有大量文献记录了如何做到这一点。阅读 Xcode 中的 NSLayoutConstraint 类参考以获得介绍(特别是关于创建约束的部分。)

标签: swift animation uiview


【解决方案1】:

尝试将您的代码如下放在 viewDidAppear 或 viewWillAppear 中,并使用异步调度。否则您的动画可能无法正常工作。

 override func viewDidAppear(animated: Bool) {
dispatch_async(dispatch_get_main_queue(), {
            UIView.animateWithDuration(0.4, animations: { () -> Void in
      self.view.center.y = 50
    })
        })
}

【讨论】:

  • 这没有任何意义。
  • 这是有道理的,不幸的是,当视图被初始化时,主队列被阻塞并且你的动画可能不会被执行,基本上在主队列上使用异步调度将确保你的动画是动画的。另外他试图调用动画in view会出现,表示view还没有出现,view出现后可以看到动画,这意味着它必须在viewDidAppear中调用,你可能不需要dispatch async,但是在一些在这种情况下,需要将动画放在主队列上的异步调度中。
  • 还有一件事是 viewDidLayoutSubviews() 在 vi​​ewDidAppear 函数之后调用,它将重置为默认(故事板约束)视图控制器主视图中的所有视图,这也可能是另一个动画不工作的原因。
【解决方案2】:

如果 UIView 使用自动布局进行约束,则无法为框架或类似属性设置动画。

你有两个选择:

  1. 摆脱自动布局并为框架目录设置动画
  2. 使用自动布局并为约束设置动画(例如通过插座)

有关示例,请参见以下链接:

How do I animate constraint-changes

IOS: ANIMATING AUTOLAYOUT CONSTRAINTS

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-04
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多