Подтвердить что ты не робот

UICollectionView внутри UIView

Я пытаюсь реализовать UICollectionView внутри a UIView, но я не могу узнать, как это сделать. Существует много учебников по использованию UICollectionView с UICollectionViewController, но не как реализовать его в обычном представлении. Как вы это делаете?

4b9b3361

Ответ 1

1) Перетащите UICollectionView в UIView и соответствующим образом настройте его.

2) Создайте свойство, которое также является IBOutlet в вашем файле .h для представления коллекции:

@property (nonatomic, retain) IBOutlet UICollectionView *myCollectionView;

3) Снова в вашем файле .h объявите своих делегатов, так что теперь ваш .h должен выглядеть примерно так:

@interface UtaQuickView : UIViewController <UICollectionViewDataSource, UICollectionViewDelegate> {

}

@property (nonatomic, retain) IBOutlet UICollectionView *myCollectionView;

4) Подключите myCollectionView IBOutlet к вашему раскадровке.

5) (необязательно) Если вы нацеливаете что-то старше, чем iOS6, синтезируйте свой myCollectionView. Если вы ориентируетесь на iOS6, он будет автоматически синтезировать его для вас. Это касается всех свойств, а не только UICollectionViews. Поэтому в iOS6 вам не нужно @synthesize myCollectionView = _myCollectionView вообще. Вы можете просто использовать _mycollectionview везде, где вам нужно получить доступ к свойству.

6) В вашем .m файле viewDidLoad установите delegate и dataSource.

_myCollectionView.delegate = self;
_myCollectionView.dataSource = self;

7) Внедрите необходимые методы dataSource:

#pragma mark - UICollectionView DataSource 

- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section 

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

Оттуда вы можете реализовать столько или меньше методов UICollectionViewDelegate, сколько вам нужно. Однако в соответствии с документацией требуются 2:

#pragma mark - UICollectionViewDelegate

- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath

- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingSupplementaryView:(UICollectionReusableView *)view forElementOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath

Важно отметить, что вы можете заменить <UICollectionViewDelegateFlowLayout> на <UICollectionViewDelegate> и по-прежнему иметь доступ ко всем методам в <UICollectionViewDelegate>, потому что <UICollectionViewDelegateFlowLayout> является подклассом <UICollectionViewDelegate>.

Документация по протоколу UICollectionViewDataSource

Документация протокола UICollectionViewDelegate

Ответ 2

И версия Swift

  • Перетащите UICollectionView в свой UIView и соответствующим образом настройте его.

  • Измените свой UIViewController для расширения UICollectionViewDataSource и UICollectionViewDelegate

  • Реализовать требуемые функции

  • Управление-перетаскивание из раскадровки в класс, чтобы создать выход "collectionView"

  • В viewDidLoad() подключите делегат и источник данных к себе collectionView.delegate = self и collectionView.dataSource = self

Он должен выглядеть следующим образом:

    class CustomerViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate
    {
        @IBOutlet weak var collectionView: UICollectionView!

        override func viewDidLoad() {
            collectionView.delegate = self
            collectionView.dataSource = self
        }

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

        }

        func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        } 

        func collectionView(collectionView: UICollectionView, didEndDisplayingCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) {

        }

        func collectionView(collectionView: UICollectionView, didEndDisplayingSupplementaryView view: UICollectionReusableView, forElementOfKind elementKind: String, atIndexPath indexPath: NSIndexPath) {

        }
    }

Ответ 3

Перетащите UICollectionView в свой UIView и соответствующим образом настройте его.  Создайте свойство, которое также является IBOutlet в вашем .h файле для коллекции:

@property (nonatomic, retain) IBOutlet UICollectionView *myCollectionView;

в UIView сначала вам нужно объявить ячейку UICollectionView в -(void)awakeFromNib

[myCollectionView registerNib:[UINib nibWithNibName:@"nib file of collectionView cell" bundle:nil] forCellWithReuseIdentifier:@"identifier"];

затем

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    custom class *cell1=[collectionView dequeueReusableCellWithReuseIdentifier:@"identifier" forIndexPath:indexPath];
    return cell1;        
}

Ответ 4

  • Перетащите uiviewcontroller в таблицу.
  • Создайте новый файл класса для нового uiviewcontoller
  • Установите вновь созданный класс в наш диспетчер представлений. И добавьте методы протокола в файл .h. -UICollectionViewDelegate, UICollectionViewDataSource
  • Перетащите uicollectionview в viewcontroller, по умолчанию появится uicollectionviewcell с представлением коллекции.
  • Создайте новый класс для настройки ячейки в качестве подкласса ячейки uicollectionviewcell и установите класс в ячейку в инспекторе идентификации. Также установите идентификатор повторного использования в инспекторе атрибутов, имя, которое мы должны указать, чтобы идентифицировать uicollectionviewcell. Скажите ячейку здесь.
  • Перетащите изображение (может быть как угодно) в ячейку uicollectionviewcell, размер которой будет соответствовать.
  • Установить изображение с изображением (это изображение будет отображаться повторно с помощью коллекции).
  • Установите делегат и источник данных с помощью uicollectionview в соответствующий диспетчер представлений.
  • Установите методы источника данных - numberOfItemsInSection и cellForItemAtIndexPath.

  • Возвращает необходимое количество клеток с помощью метода numberOfItemsInSection. Скажите 10 здесь.

  • Верните ячейку для отображения с помощью cellForItemAtIndexPath.

    NSString *  identifier = @"cell";
    CollectionViewCellForDay * cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
    return cell;
    

К настоящему моменту вы должны иметь визуальное представление о 10 ячейках коллекции:)