如何在 Swift 3 中加载/删除带有动画的自定义视图

Posted

技术标签:

【中文标题】如何在 Swift 3 中加载/删除带有动画的自定义视图【英文标题】:How to load/remove Custom View with animation in Swift 3 【发布时间】:2017-12-13 14:49:17 【问题描述】:

加载视图控制器后,我正在显示一些自定义视图。像横幅一样,我正在展示该自定义视图。我通过获取 nib 文件和定义的元素来创建该视图。它的加载很好,但是,我想在加载自定义视图时添加一些动画。

我尝试了以下代码,但无法正常工作。

override func viewDidLoad() 
    super.viewDidLoad()

    let nib = UINib(nibName: "NotificationBannerView", bundle: nil)
    let objects = nib.instantiate(withOwner: nil, options: nil)
    notificationView = objects.first as! NotificationBannerView
    UIView.animate(withDuration: 0.5, delay: 0.3, options: .curveEaseOut, animations: 
        self.notificationView.layoutIfNeeded()
        self.view.addSubview(self.notificationView)
    , completion: nil)

我没有使用自动调整大小(大小类)类。

有什么建议可以实现这一目标吗?谢谢!

【问题讨论】:

【参考方案1】:

首先,您要将视图添加为子视图:

self.view.addSubview(self.notificationView)

然后,你想添加一些约束来定义它应该在哪里,例如:

notificationView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    notificationView.leftAnchor.constraint(equalTo: self.view.leftAnchor),
    notificationView.rightAnchor.constraint(equalTo: self.view.rightAnchor),
    notificationView.topAnchor.constraint(equalTo: self.view.topAnchor),
    notificationView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
])

然后你想添加动画,例如,淡入:

self.notificationView.alpha = 0

UIView.animate(withDuration: 0.5, delay: 0.3, options: .curveEaseOut, animations: 
    self.notificationView.alpha = 1
, completion: nil)

旁注:

如果您想使用自动布局从其他地方将其动画到视图中,那么在将其添加为子视图并激活初始约束集调用后:

self.view.setNeedsLayout()
self.view.layoutIfNeeded()

然后定义一组新的约束来定义其最终帧,在激活它们之后再次调用:

self.view.setNeedsLayout()

最后在动画块中使用(这将动画notificationView的新帧):

UIView.animate(withDuration: 0.5, delay: 0.3, options: .curveEaseOut, animations: 
    self.view.layoutIfNeeded()
, completion: nil)

【讨论】:

我没有使用约束,我使用的是尺寸类,如果我使用此代码,它会将整个屏幕作为框架。 size classes 和 autolayout 都是关于别的东西.. 你可以使用 autolayout 和 size classes.. 当然它将整个屏幕作为一个框架,这就是 NSLayoutConstraint.activate() 指定的部分..只需将这些约束更改为您想要的任何内容 - 您没有告诉使用您想要如何定位它,所以我仅将其用作示例.. 没有帮助,自定义视图完成了我定义为某个框架的屏幕,无论如何,谢谢。我已经发布了工作代码。【参考方案2】:
let nib = UINib(nibName: "NotificationBannerView", bundle: nil)
let objects = nib.instantiate(withOwner: nil, options: nil)
notificationView = objects.first as! NotificationBannerView
notificationView.frame = CGRect(x:-100; y:0; width: 100; height:100)

self.view.addSubView(notificationView)

UIView.animate(withDuration: 0.5, delay: 0.3, options: .curveEaseIn, animations: 
      notificationView.frame = CGRect(x:10; y:20; width: 100; height:100)
, completion: nil)

这将显示左侧的视图和动画。

【讨论】:

请告诉我发生了什么。 什么也没发生。【参考方案3】:

最后,我找到了解决方案。 我希望这对未来的人有所帮助。

   override func viewDidAppear(_ animated: Bool) 
    //animation
    UIView.animate(withDuration: 5, delay: 0.3, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: .curveEaseOut, animations: 
        self.notificationView.transform = CGAffineTransform(scaleX: 1, y: 0.5)
        self.notificationView.transform = CGAffineTransform(rotationAngle: CGFloat.pi/360)
        self.notificationView.frame = CGRect(x: 2, y: self.pageControl.frame.maxY, width:self.view.frame.width-2, height:130)
    , completion: nil)

    

【讨论】:

以上是关于如何在 Swift 3 中加载/删除带有动画的自定义视图的主要内容,如果未能解决你的问题,请参考以下文章

如何在Android中加载带有动画的cardview GridView?

在搜索栏iOS swift3中加载带有条目的单元格时,图像无法正确显示

在 Sencha Touch 2 中加载动画交互内容

Swift 2 - 无法在单独的 ViewController 中加载 UIWebView

在 UIScrollView Swift3 中加载 UIViewController

如何在 Swift 中加载远程 JSON 文件?