Как переключить UITableView и UICollectionView

У меня есть проект с кнопкой, которая позволяет пользователю переключаться между списком (UITableView) и сеткой (UICollectionView), но я не знаю, как это сделать.

Ответ 1

Предположим, что ваш контроллер имеет свойство UITableView с именем tableView и свойство UICollectionView с именем collectionView. В вашем viewDidLoad вам нужно добавить начальное представление. Предположим, что это табличный вид:

- (void)viewDidLoad
{
    self.tableView.frame = self.view.bounds;
    [self.view addSubview:self.tableView];
}

Затем в обратном вызове кнопки замените просмотры:

- (void)buttonTapped:(id)sender
{
     UIView *fromView, *toView;

     if (self.tableView.superview == self.view)
     {
         fromView = self.tableView;
         toView = self.collectionView;
     }
     else
     {
         fromView = self.collectionView;
         toView = self.tableView;
     }

     [fromView removeFromSuperview];

     toView.frame = self.view.bounds;
     [self.view addSubview:toView];
}

Если вам нужна фантастическая анимация, вы можете вместо этого использовать +[UIView transitionFromView:toView:duration:options:completion:]:

- (void)buttonTapped:(id)sender
{
     UIView *fromView, *toView;

     if (self.tableView.superview == self.view)
     {
         fromView = self.tableView;
         toView = self.collectionView;
     }
     else
     {
         fromView = self.collectionView;
         toView = self.tableView;
     }

     toView.frame = self.view.bounds;
     [UIView transitionFromView:fromView
                         toView:toView
                       duration:0.25
                        options:UIViewAnimationTransitionFlipFromRight
                     completion:nil];
}

Ответ 2

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

Чтобы преобразовать из UITableView в UICollectionView, в Интернете есть много обучающих программ, например this.