2015-10-06 3 views
0

Я довольно новичок в стремительном/объективном C, и мне интересно, может ли кто-нибудь помочь мне с проблемой, с которой я связан с анимацией изображения (прокручиваем справа налево). В настоящее время у меня есть UIImageView на моем VC, и он не вызывает никаких проблем. Тем не менее, я думаю, что может быть лучше, если бы я использовал UICollectionView. Может ли кто-нибудь, пожалуйста, указать мне в правильном направлении, пожалуйста? Мне еще предстоит разобраться с представлением коллекции в глубину, поэтому концепция относительно нова для меня. Мой код для текущей ситуации:UICollectionView imageview animation

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 

} 

}

Заранее спасибо!

+0

В настоящее время в моей функции switchImage(), indexPath не регистрируется в системе ... Я определенно чего-то не хватает! – Matty

ответ

0

Вы можете поместить CollectionView на свой контроллер представления и создать индивидуальную коллекцию, которая представляет собой размер представления коллекции (так что только одна ячейка подходит для экрана одновременно) и содержит изображение.

Это позволит пользователям перелистывать снимки с хорошей оснасткой анимации между клетками, а также вы можете легко анимировать через индекс CollectionView клеток на таймере с помощью метода:

ObjC:

[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES]; 

Swift:

self.collectionView?.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.Top, animated: true) 

Настройка вида сбора и пользовательские ячейки учебника: http://adoptioncurve.net/archives/2012/09/a-simple-uicollectionview-tutorial/

+0

глупый вопрос, но я применяю self.collectionView? .scrollToItemAtIndexPath (...) в функции просмотра коллекции правильно? – Matty

+1

Глупые вопросы самые лучшие! - Вы можете вызвать self.collectionView? .scrollToItemAtIndexPath в любом методе в контроллере представления, что у вас есть ссылка на 'self.collectionView?' (иначе self.collectionView не будет существовать, и ваше приложение будет конфликтовано) ;; Так, например, в вашем методе viewDidLoad контроллера представления, содержащего yoru collectionview, вы можете запустить NSTimer, который вызывает метод сам по себе: switchImage() {self.collectionView? .scrollToItem ..} с интервалом времени. – JoshR604

+1

timer = NSTimer.scheduledTimerWithTimeInterval (5, target: self, selector: Selector ("switchImage"), userInfo: nil, repeat: BOOL) – JoshR604

0

У вас есть два отдельных действия здесь.

Во-первых, вам необходимо заполнить представление коллекции данными. Это то, что вы делаете в cellForItemAtIndexPath.

Во-вторых, вам нужно анимировать через ваш вид коллекции, который был просто заполнен данными (вашими изображениями).

Если вы хотите, чтобы он был полноэкранным, просто установите размер каждой ячейки в рамки вида коллекции.

В режиме просмотраDidLoad обязательно укажите источник данных для настройки просмотра коллекции и данных.

После этого вы можете установить таймер, чтобы начать прокрутку по указательным дорожкам. Вам нужно будет создать собственные объекты NSIndexPath. Вам просто нужно отслеживать индекс фоторесурса (как строку), если есть только один раздел.

Наконец, вам нужно знать, когда вы находитесь в конце фотографий, чтобы остановить таймер (строка < images.count).

+0

Не могли бы вы пояснить, как я буду строить свои собственные объекты NSIndexPath? – Matty

+0

ОК, поэтому я просто попробовал объявить в своем классе ViewController 'var indexPath1 = NSIndexPath (forRow: 0, forSection: 0)' ... я на правильном пути? – Matty

+0

Да. Вы проигнорируете раздел (он всегда будет 0), а затем просто увеличивайте строку, которая является вашим индексом фоторесурсов. Я бы создал вспомогательный метод для переноса вашего индекса (NSUInteger) в NSIndexPath для просмотра коллекции. - (NSIndexPath *) indexPathForPhotoIndex: (NSUInteger) index { return [NSIndexPath indexPathForRow: индексный раздел: 0]; } –

Смежные вопросы