UICollectionView 图像视图动画
Posted
技术标签:
【中文标题】UICollectionView 图像视图动画【英文标题】:UICollectionView imageview animation 【发布时间】:2015-10-06 22:33:44 【问题描述】:我对 swift/objective C 相当陌生,我想知道是否有人可以帮助我解决与图像视图动画相关的问题(从右到左滚动)。我目前在我的 VC 上有一个 UIImageView,它的动画没有问题。但是,我认为最好使用 UICollectionView 代替。有人可以请我指出正确的方向吗?我还没有深入处理集合视图,所以这个概念对我来说相对较新。我对当前情况的代码是:
import UIKit
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource
@IBOutlet weak var sponsorAnimation: UIImageView!
let images = [
UIImage(named: "runforcure")!,
UIImage(named: "marquee")!]
var index = 0
let animationDuration: NSTimeInterval = 1
let switchingInterval: NSTimeInterval = 3
override func viewDidLoad()
super.viewDidLoad()
sponsorAnimation.image = images[index]
animateImageView()
func animateImageView()
CATransaction.begin()
CATransaction.setAnimationDuration(animationDuration)
CATransaction.setCompletionBlock
let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(self.switchingInterval * NSTimeInterval(NSEC_PER_SEC)))
dispatch_after(delay, dispatch_get_main_queue())
self.animateImageView()
let transition = CATransition()
transition.type = kCATransitionPush
transition.subtype = kCATransitionFromRight
/*
transition.type = kCATransitionPush
transition.subtype = kCATransitionFromRight
*/
sponsorAnimation.layer.addAnimation(transition, forKey: kCATransition)
sponsorAnimation.image = images[index]
CATransaction.commit()
index = index < images.count - 1 ? index + 1 : 0
我的理想情况是一次显示一张图片,并且每 3 秒从右向左滚动一次。
更新:我认为我真的很接近,但是在最后两行代码中我不知道将 self.collectionview 放在哪里? .任何帮助是极大的赞赏。再次提前感谢!
import UIKit
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource
@IBOutlet weak var collectionView: UICollectionView!
let images = [UIImage(named: "oneteam"), UIImage(named: "runforcure")]
var timer = NSTimer()
override func viewDidLoad()
super.viewDidLoad()
timer = NSTimer.scheduledTimerWithTimeInterval(5, target: self, selector: Selector("switchImage"), userInfo: nil, repeats: true)
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return self.images.count
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as! CollectionViewCell
cell.imageView?.image = self.images[indexPath.row]
/*I don't know where to place this line of code? If I place is outside of this function then it says unresolved identifier 'indexPath'*/
self.collectionView?.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.Top, animated: true)
return cell
提前致谢!
【问题讨论】:
当前在我的 switchImage() 函数中,indexPath 没有在系统中注册...我肯定错过了什么! 【参考方案1】:您可以在您的视图控制器上放置一个 CollectionView 并创建一个与集合视图大小相同的自定义集合视图单元格(因此一次只能在屏幕上显示一个单元格)并包含一个图像视图。
这将允许用户在单元格之间通过漂亮的快照动画在图像中滑动,并且您可以使用以下方法轻松地通过计时器上的单元格的 collectionview 索引进行动画处理:
对象:
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES];
斯威夫特:
self.collectionView?.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.Top, animated: true)
设置集合视图和自定义单元格教程:http://adoptioncurve.net/archives/2012/09/a-simple-uicollectionview-tutorial/
【讨论】:
愚蠢的问题,但我在集合视图函数中应用 self.collectionView?.scrollToItemAtIndexPath(...) 对吗? 愚蠢的问题是最好的! -- 你可以在视图控制器中的任何方法中调用 self.collectionView?.scrollToItemAtIndexPath,只要你引用了'self.collectionView?' (否则 self.collectionView 将不存在,您的应用程序将被混淆);;因此,例如,在包含 yoru collectionview 的视图控制器的 viewDidLoad 方法中,您可以启动一个 NSTimer,它在一段时间内调用自身的方法:switchImage() self.collectionView?.scrollToItem.. 。 timer = NSTimer.scheduledTimerWithTimeInterval(5, target:self, selector: Selector("switchImage"), userInfo: nil, repeats: BOOL) 嗨乔希,我一定是遗漏了一些东西,因为我目前遇到了错误。请在我编辑的问题中查看附加代码!非常感谢您的帮助。override func viewDidLoad() super.viewDidLoad() timer=NSTimer.scheduledTimerWithTimeInterval(5,target: self, selector: Selector("switchImage"), userInfo: nil, repeats: true)
我收到一条错误消息,提示未解析的标识符“计时器”?我在哪里声明这个计时器?谢谢!【参考方案2】:
您在这里有两个单独的操作。
首先,您需要用数据填充集合视图。这就是你在 cellForItemAtIndexPath 中所做的。
其次,您需要对刚刚填充了数据(您的图像)的集合视图进行动画处理。
如果您希望它是全屏的,只需将每个单元格大小设置为集合视图的边界即可。
在 viewDidLoad 中确保为集合视图设置准备好数据源并准备好数据。
之后,您可以设置一个计时器以开始滚动浏览索引路径。您需要构建自己的 NSIndexPath 对象。如果只有一个部分,您只需要跟踪照片数组索引(作为行)。
最后,您需要一个条件来知道您何时到达照片的末尾以停止计时器(行
【讨论】:
能否请您解释一下我将如何构建自己的 NSIndexPath 对象? 好的,所以我只是尝试在我的 ViewController 类中声明var indexPath1 = NSIndexPath(forRow: 0, forSection: 0)
...我在正确的轨道上吗?
是的。您将忽略该部分(它始终为 0),然后只增加行,这是您的照片数组索引。我将创建一个辅助方法来将您的索引 (NSUInteger) 包装在 NSIndexPath 中以供集合视图使用。 - (NSIndexPath *)indexPathForPhotoIndex:(NSUInteger)index return [NSIndexPath indexPathForRow:index section:0]; 以上是关于UICollectionView 图像视图动画的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView:1 行水平滚动(从右到左),带有来自右侧的新单元格的自定义动画
如何使用持续时间为单个 UICollectionView 单元格设置动画
UICollectionView 单元格没有选择翻转动画,视图丢失
UICollectionVIew:在视图滚动时为单元格设置动画