Vitaly_Vladimirovich
@Vitaly_Vladimirovich

Swift. Как сделать Карусель на UIKit с показом ОДНОЙ ячейки за раз, при этом Image не на всю ширину CollectionView по ширине (либо длине также)?

1) Я пытаюсь сделать Carousel с PageControl на UIKit с показом одной ячейки за раз, при этом изображение должно быть меньше ширины CollectionView, и я не хочу использовать какие-либо Pods или SwiftUI. Интересно и нужно найти решение.
Page Control я пока не приколачивал в коде.

2) И есть проблем что когда возвращаюсь по карусели обратно до 1-ой картинки, первая картинка теряет отступ слева (то это вторичное, главное прошу помочь хоть с первым главное!).

ЭТО МОЙ РЕЗУЛЬТАТ (.gif) - https:// ibb.co/ QcMsFZF (удалить пробелы)


Уверен очень многим будет полезно, так как видел много таких вопросов!

Либо может быть кто-то даст подсказку либо ссылку на нужное решение?
Я все изучу, разберусь и наберусь опыта

Заранее благодарю!)

Мой код CollectionView:

class TopGalleryCollectionView: UICollectionView, UICollectionViewDelegate, UICollectionViewDataSource {
    
    var channels: [TopGalleryModel] = []

    init() {
        let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .horizontal
        super.init(frame: .zero, collectionViewLayout: layout)
        
        backgroundColor = #colorLiteral(red: 0.113761507, green: 0.1048973277, blue: 0.150441885, alpha: 1)
        delegate = self
        dataSource = self
        register(TopGalleryCollectionViewCell.self, forCellWithReuseIdentifier: TopGalleryCollectionViewCell.reuseId)
        
        translatesAutoresizingMaskIntoConstraints = false
        
        layout.minimumLineSpacing = Constants.galleryMinimumLineSpacing
        
        // и св-во CollectionView, которое отвечает за принятие отступов
        contentInset = UIEdgeInsets(top: 0, left: Constants.leftDistanceToView, bottom: 0, right: Constants.rightDistanceToView)
        
        showsHorizontalScrollIndicator = false
        showsVerticalScrollIndicator = false
        isPagingEnabled = true
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    // MARK: - Data Source
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return channels.count
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = dequeueReusableCell(withReuseIdentifier: TopGalleryCollectionViewCell.reuseId, for: indexPath) as! TopGalleryCollectionViewCell
        cell.mainImageView.image = channels[indexPath.row].coverImage
        cell.nameOfChannel.text = channels[indexPath.row].nameOfChannel
        cell.numberOfSubscribers.text = channels[indexPath.row].numberOfSubscribers
        return cell
    }
    
    // MARK: - Filling with content
    
    func setContentFor(channels: [TopGalleryModel]) {
        self.channels = channels
    }
    // будем вызывать ее там, от куда мы будем получать наши данные. В нашем случае мы будем получать их в файле ViewController

}

extension TopGalleryCollectionView: UICollectionViewDelegateFlowLayout {
    
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: Constants.galleryItemWidth, height: frame.height)
    }
    
}
  • Вопрос задан
  • 334 просмотра
Пригласить эксперта
Ответы на вопрос 1
Возможно, я неверно понял вопрос, но выглядит так, что в функции collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) нужно для cell задать констрэйнты и прибить её к нужным краям экрана. А уже в TopGalleryCollectionViewCell пилить вёрстку относительно всей ячейки для внутреннего контента.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы