如何在 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中加载带有条目的单元格时,图像无法正确显示
Swift 2 - 无法在单独的 ViewController 中加载 UIWebView