2017-06-10 18 views
0

UICollectionViewでスライドショーを作成したいと思います。コレクションビューとカスタムセルを作成しました。私はすべての画像を表示していますが、自動スクロールはしていません。だから私は、ビューコントローラがロードされるとき、コレクションビューのすべてのセルは、スライドボタンを押しても自動的にスクロールする必要があります。しかし、私はすべての文書を検索したが見つかりませんでした。ですから、何か考えてもらったり、チュートリアルのリンクも教えてください。コレクションビューで画像を自動的にスライドする方法

答えて

2

ここではから得ることができるUICollectionViewの簡単な自動スクロールコンポーネントを実装しました。

私は生のコードを含めましたあなたは、以下の必要があります。

スウィフト3.0+:

@IBOutlet weak var collectionView: UICollectionView! 

    var timer:Timer? = nil   
    var datasource: [UIImage]? 

    @IBAction func previousButtonAction(sender: UIButton) { 

      if self.datasource != nil { 

       if self.datasource?.count != 0 { 

        self.scrollToPreviousOrNextCell(direction: "Previous") 

       } 

      } 

     } 


    @IBAction func nextButtonAction(sender: UIButton) { 

     if self.datasource != nil { 

      if self.datasource?.count != 0 { 

       self.scrollToPreviousOrNextCell(direction: "Next") 

      } 

     } 

    } 

    @IBAction func pauseButtonAction(sender: UIButton) { 

     self.timer.invalidate() 

    } 

    //After you've received data from server or you are ready with the datasource, call this method. Magic! 
    func reloadCollectionView() { 

     self.collectionView.reloadData() 

     // Invalidating timer for safety reasons 
     self.timer?.invalidate() 

     // Below, for each 3.5 seconds MyViewController's 'autoScrollImageSlider' would be fired 
     self.timer = Timer.scheduledTimer(timeInterval: 3.5, target: self, selector: #selector(MyViewController.autoScrollImageSlider), userInfo: nil, repeats: true) 

     //This will register the timer to the main run loop 
     RunLoop.main.add(self.timer!, forMode: .commonModes) 

    } 

    func scrollToPreviousOrNextCell(direction: String) { 

      DispatchQueue.global(qos: .background).async { 

       DispatchQueue.main.async { 

        let firstIndex = 0 
        let lastIndex = (self.datasource?.count)! - 1 

        let visibleIndices = self.collectionView.indexPathsForVisibleItems 

        let nextIndex = visibleIndices[0].row + 1 
        let previousIndex = visibleIndices[0].row - 1 

        let nextIndexPath: IndexPath = IndexPath.init(item: nextIndex, section: 0) 
        let previousIndexPath: IndexPath = IndexPath.init(item: previousIndex, section: 0) 

        if direction == "Previous" { 

         if previousIndex < firstIndex { 


         } else { 

          self.collectionView.scrollToItem(at: previousIndexPath, at: .centeredHorizontally, animated: true) 
         } 

        } else if direction == "Next" { 

         if nextIndex > lastIndex { 


         } else { 

          self.collectionView.scrollToItem(at: nextIndexPath, at: .centeredHorizontally, animated: true) 

         } 

        } 

       } 

      } 

     } 

    func autoScrollImageSlider() { 

      DispatchQueue.global(qos: .background).async { 

       DispatchQueue.main.async { 

        let firstIndex = 0 
        let lastIndex = (self.datasource?.count)! - 1 

        let visibleIndices = self.collectionView.indexPathsForVisibleItems 
        let nextIndex = visibleIndices[0].row + 1 

        let nextIndexPath: IndexPath = IndexPath.init(item: nextIndex, section: 0) 
        let firstIndexPath: IndexPath = IndexPath.init(item: firstIndex, section: 0) 

        if nextIndex > lastIndex { 

         self.collectionView.scrollToItem(at: firstIndexPath, at: .centeredHorizontally, animated: true) 

        } else { 

         self.collectionView.scrollToItem(at: nextIndexPath, at: .centeredHorizontally, animated: true) 

        } 

       } 

      } 

     } 


    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

     let cellId = "cell" 

     //Use your custom cell 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! UICollectionViewCell 
     cell.imageView.image = self.datasource[indexPath.row] 

     return cell 

    } 

    //Make sure you invalidate the timer here 
    override func viewWillDisappear(_ animated: Bool) { self.timer?.invalidate() } 


のObjective C:私が作った

@interface MyViewController() <UICollectionViewDelegate, UICollectionViewDataSource> { 

    NSTimer *timer; 
    NSMutableArray *datasource; 

} 

@property (nonatomic, weak) IBOutlet UICollectionView *collectionView; 

@end 

@implementation MyViewController 

- (IBAction)previousButtonAction:(UIButton *)sender { 

    if (datasource != nil) { 
     if (datasource.count != 0) { 
      [self scrollToPreviousOrNextCell:@"Previous"]; 
     } 
    } 
} 

- (IBAction)nextButtonAction:(UIButton *)sender { 

    if (datasource != nil) { 
     if (datasource.count != 0) { 
      [self scrollToPreviousOrNextCell:@"Next"]; 
     } 
    } 
} 

- (IBAction)pauseButtonAction:(UIButton *)sender { [timer invalidate]; } 

//After you've received data from server or you are ready with the datasource, call this method. Magic! 
- (void) reloadCollectionView { 

    [self.collectionView reloadData]; 

    // Invalidating timer for safety reasons 
    [timer invalidate]; 

    // Below, for each 3.5 seconds MyViewController's 'autoScrollImageSlider' would be fired 
    timer = [NSTimer scheduledTimerWithTimeInterval:3.5 target:self selector:@selector(autoScrollImageSlider) userInfo:nil repeats:YES]; 

    //This will register the timer to the main run loop 
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 

} 

- (void)scrollToPreviousOrNextCell:(NSString *)direction { 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 

     NSInteger firstIndex = 0; 
     NSInteger lastIndex = datasource.count - 1; 

     NSArray *visibleIndices = [self.collectionView indexPathsForVisibleItems]; 

     NSInteger nextIndex = [[visibleIndices objectAtIndex:0] row] + 1; 
     NSInteger previousIndex = [[visibleIndices objectAtIndex:0] row] - 1; 

     NSIndexPath *nextIndexPath = [NSIndexPath indexPathForRow:nextIndex inSection:0]; 
     NSIndexPath *previousIndexPath = [NSIndexPath indexPathForRow:previousIndex inSection:0]; 

     if ([direction isEqualToString:@"Previous"]) { 

      if (previousIndex < firstIndex) { 

      } else { 
       [self.collectionView scrollToItemAtIndexPath:previousIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES]; 
      } 

     } else if ([direction isEqualToString:@"Next"]) { 

      if (nextIndex > lastIndex) { 

      } else { 
       [self.collectionView scrollToItemAtIndexPath:nextIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES]; 
      } 
     } 

    }); 
} 

-(void) autoScrollImageSlider { 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 

     NSInteger firstIndex = 0; 
     NSInteger lastIndex = datasource.count - 1; 

     NSArray *visibleIndices = [self.collectionView indexPathsForVisibleItems]; 
     NSInteger nextIndex = [[visibleIndices objectAtIndex:0] row] + 1; 

     NSIndexPath *nextIndexPath = [NSIndexPath indexPathForRow:nextIndex inSection:0]; 
     NSIndexPath *firstIndexPath = [NSIndexPath indexPathForRow:firstIndex inSection:0]; 

     if (nextIndex > lastIndex) { 
      [self.collectionView scrollToItemAtIndexPath:firstIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES]; 
     } else { 
      [self.collectionView scrollToItemAtIndexPath:nextIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES]; 
     } 

    }); 

} 


- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 

    NSString *cellId = @"cell"; 

    //Use your custom cell 
    UICollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath]; 
    cell.imageView.image = [datasource objectAtIndex:[indexPath row]]; 

    return cell; 

} 


//Make sure you invalidate the timer here 
-(void)viewWillDisappear:(BOOL)animated { [timer invalidate]; } 
+0

reloadCollectionViewメソッドが呼び出されなければなりません。これは 'viewDidLoad'またはどこでも呼び出すことができます。 'reloadData'を直接呼び出すのではなく、コレクションビューをリロードしたいときはいつでも、' reloadCollectionView'を呼び出します。それは自動的にスライドを開始します。 –

+0

@Ganesh、ありがとう。ボタンを押したままスクロールしたいとします。私はUIに意味、私は3つのボタンを、前に、ネット&ポーズと呼ばれる。その時間を管理する方法 – Abhinaba

+0

私はそれらを私の答えに加えます。 –

0

をオートスライドのデモコレクションビューのセルとgithubの上に置くあなたはすべての画像の準備ができていたときにgithubのレポに下記のリンクを参照してください

https://github.com/irshad281/SlideCollectionView

関連する問題