1

Я пытаюсь сделать анимацию перехода, как демонстрацию в ссылке here. Поэтому, когда я нажал на ячейку, она расширяется и охватывает весь экран.Расширение UICollectionView и его ячейки при нажатии

Вот мои коды (я должен признать, что я не знаком с CollectionView) `

import UIKit 

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { 

@IBOutlet weak var mainDesLabel: UILabel! 
@IBOutlet weak var collectionView: UICollectionView! 
@IBOutlet weak var secDesLabel: UILabel! 
let searchBar = UISearchBar() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    self.collectionView.delegate = self 
    self.collectionView.dataSource = self 
    self.collectionView.backgroundColor = UIColor.clearColor() 
    //////////////////////////////////////////////////////////////////////// 
    self.searchBar.frame = CGRect(x: 175, y: 0, width: 200, height: 50) 
    self.searchBar.searchBarStyle = UISearchBarStyle.Minimal 
    self.searchBar.backgroundColor = UIColor.whiteColor() 
    self.view.addSubview(searchBar) 
    //////////////////////////////////////////////////////////////////////// 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return 10 
} 

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) as UICollectionViewCell 

    cell.layer.cornerRadius = 5 

    return cell 
} 



func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
    return 1 
} 

//Use for size 
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 
    self.collectionView.frame = self.view.bounds 
    let cell = collectionView.cellForItemAtIndexPath(indexPath) 
    cell!.frame = CGRectMake(0, 0, self.view.bounds.width, self.view.bounds.height) 
} 


} 

Так я думал, что использование«didSelectItemAtIndexPath»помогло бы, однако, оказывается, как this

мысли ? Любая помощь будет высоко оценен!

+0

https: //www.raywenderlich.com/113845/ios-animation-tutorial-custom-view-controller-presentation-transitions – HMHero

ответ

2

Вы не можете просто использовать didSelectItemAtIndexPath или любые подобные методы, чтобы обновить размер UICollectionViewCell когда UICollectionView делается выполнение макета просмотра.

Чтобы обновить высоту ячейки, Вы можете первый захват, который прослушивались клетки в didSelectItemAtIndexPath. Затем вы можете либо перезагрузить весь вид коллекции, передав новый кадр ячейки в sizeForItemAtIndexpath. Или вы можете просто перезагрузить определенную ячейку reloadItemsAtIndexPaths, но вам все равно нужно передать обновленный размер ячейки через sizeForItemAtIndexpath.

UPDATE Теперь я вижу, что детали вопроса были обновлены анимацией, которую вы желаете иметь.

я выполнил подобную анимацию: -

  1. Захватив клетку, которая была повернутой в didSelectItemAtIndexPath.
  2. Добавление представления реплики в UIViewContrller, но с его фреймом, полностью совпадающим с ячейкой, которую прослушивали.
  3. Затем, оживляя этот вид, который был добавлен. Таким образом создается впечатление, что камера была анимирована.

Любая дополнительная функциональность, которая должна быть предоставлена, также может быть написана в этом представлении. Таким образом, код ячейки и анимированный вид также разделяются.

+0

Thx, это дает мне представление о том, как этого достичь. У вас есть пример для этого? Я смущен некоторыми шагами. –

+0

Например, я пытаюсь поместить uiview, который случайно закрывает ячейку, однако он был добавлен в ячейку ... –

+0

UICollectionViewLayoutAttributes * attributes = [self.collectionView layoutAttributesForItemAtIndexPath: indexPath]; Затем с атрибутами.frame вы можете получить фрейм ячейки. Теперь вам нужно разместить репликацию на контроллере заметок с помощью этого фрейма. (Примечание: viewcontroller, а не cell или collectionview) – 7vikram7

1

Или что вы можете сделать, это развернуть элемент и сменить его рамку на UIAnimation.

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

что-то вроде этого:

override func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { 

    let item = collectionView.cellForItemAtIndexPath(indexPath) as! cellCollectionViewExpress // or whatever you collection view cell class name is. 

    UIView.animateWithDuration(1.0, animations: { 
     self.view.bringSubviewToFront(collectionView) 
     collectionView.bringSubviewToFront(item) 
     item.frame.origin = self.view.frame.origin /// this view origin will be at the top of the scroll content, you'll have to figure this out 
     item.frame.size.width = self.view.frame.width 
     item.frame.size.height = self.view.frame.height 
    }) 
} 

Я хотел бы предложить вам, что вы используете UICollectionView контроллер, так что вещи на легкость в целом с помощью этого.

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