рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП "
UICollectionView Tutorial: рдордХреНрдЦреА рдкрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдмрджрд▓рдирд╛ " рд▓реЗрдЦ рдХрд╛ рдЕрдиреБрд╡рд╛рдж
рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ ред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрд░реАрдХреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрдирдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдФрд░ рдЧрддрд┐рд╢реАрд▓ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдпрд╣рд╛рдВ рд╣рдо рд╕рдВрдЧреНрд░рд╣ рдФрд░ рдСрдЯреЛрд▓реИрдпреВрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдорд┐рд▓рддрд╛ рд╣реИ:
рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЕрдХреНрд╕рд░ рдРрд╕реА рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпрд╛рдВ рд╣реЛрддреА рд╣реИрдВ рдЬрдм рдЯреЗрдмрд▓ рджреГрд╢реНрдп рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЛ рддрддреНрд╡реЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдЕрдзрд┐рдХ рд░реЛрдЪрдХ рдФрд░ рдЕрджреНрд╡рд┐рддреАрдп рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ "рдЪрд┐рдк" рдмрди рд╕рдХрддреА рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ UICollectionView рдФрд░ UICollectionViewDelegateFlowLayout рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИрдВред
рдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛрдбредрдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП:
рдлрд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП UIImageView рдФрд░ UILabel рдХреЗ рд╕рд╛рде рд╕реЗрд▓
рд╣рдо рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП xib рдХреЗ рд╕рд╛рде рдПрдХ рдЕрд▓рдЧ рдлрд╛рдЗрд▓ рдореЗрдВ рд╕реЗрд▓ рдмрдирд╛рдПрдВрдЧреЗред
рдбрд┐рдЬрд╛рдЗрди рджреНрд╡рд╛рд░рд╛, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ 2 рд╕рдВрднрд╛рд╡рд┐рдд рд╕реЗрд▓ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ - рдиреАрдЪреЗ рдкрд╛рда рдФрд░ рдЫрд╡рд┐ рдХреЗ рджрд╛рдИрдВ рдУрд░ рдкрд╛рда рдХреЗ рд╕рд╛рдеред


рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЖрдкрдХреЛ 2 рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдиреЗ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдРрд╕реА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ UIStackView рдХреЗ рд╕рд╛рде 1 рд╕реЗрд▓ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдг:- UIView рдЬреЛрдбрд╝реЗрдВ
- рдЗрд╕рдХреЗ рдЕрдВрджрд░ UIStackView (рдХреНрд╖реИрддрд┐рдЬ) рдЬреЛрдбрд╝реЗрдВ
- рдЗрд╕рдХреЗ рдмрд╛рдж, UIImageView рдФрд░ UILabel рдХреЛ UIStackView рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред
- рдпреВрдмрд┐рд▓ рдХреЗ рд▓рд┐рдП, рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рд╕рдВрдкреАрдбрд╝рди рдкреНрд░рддрд┐рд░реЛрдз рдкреНрд░рд╛рдердорд┐рдХрддрд╛ = 1000 рдХрд╛ рдорд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВред
- UIImageView рдкрд╣рд▓реВ рдЕрдиреБрдкрд╛рдд рдХреЗ рд▓рд┐рдП 1: 1 рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдХреЛ 750 рдореЗрдВ рдмрджрд▓реЗрдВред
рдХреНрд╖реИрддрд┐рдЬ рдореЛрдб рдореЗрдВ рд╕рд╣реА рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдо рдЕрдкрдиреЗ рд╕реЗрд▓ рдХреЛ рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рджреЛрдиреЛрдВ рдореЛрдб рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
рдХреНрд╖реИрддрд┐рдЬ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдорд╛рдирджрдВрдб рд╕реЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ рд╣реА рд╣реЛрдЧрд╛ред рдпрд╛рдиреА рдпрджрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рд╣реИ - рдХреНрд╖реИрддрд┐рдЬ рдореЛрдб рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдКрд░реНрдзреНрд╡рд╛рдзрд░ред рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкрд░реНрдпрд╛рдкреНрдд рдЬрдЧрд╣ рд╣реИ рдЬрдм рдЪреМрдбрд╝рд╛рдИ рдКрдВрдЪрд╛рдИ рд╕реЗ 2 рдЧреБрдирд╛ рдЕрдзрд┐рдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЫрд╡рд┐ рдЪреМрдХреЛрд░ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред
рд╕реЗрд▓ рдХреЛрдб: class FruitCollectionViewCell: UICollectionViewCell { static let reuseID = String(describing: FruitCollectionViewCell.self) static let nib = UINib(nibName: String(describing: FruitCollectionViewCell.self), bundle: nil) @IBOutlet private weak var stackView: UIStackView! @IBOutlet private weak var ibImageView: UIImageView! @IBOutlet private weak var ibLabel: UILabel! override func awakeFromNib() { super.awakeFromNib() backgroundColor = .white clipsToBounds = true layer.cornerRadius = 4 ibLabel.font = UIFont.systemFont(ofSize: 18) } override func layoutSubviews() { super.layoutSubviews() updateContentStyle() } func update(title: String, image: UIImage) { ibImageView.image = image ibLabel.text = title } private func updateContentStyle() { let isHorizontalStyle = bounds.width > 2 * bounds.height let oldAxis = stackView.axis let newAxis: NSLayoutConstraint.Axis = isHorizontalStyle ? .horizontal : .vertical guard oldAxis != newAxis else { return } stackView.axis = newAxis stackView.spacing = isHorizontalStyle ? 16 : 4 ibLabel.textAlignment = isHorizontalStyle ? .left : .center let fontTransform: CGAffineTransform = isHorizontalStyle ? .identity : CGAffineTransform(scaleX: 0.8, y: 0.8) UIView.animate(withDuration: 0.3) { self.ibLabel.transform = fontTransform self.layoutIfNeeded() } } }
рдЪрд▓реЛ рдореБрдЦреНрдп рдкреНрд░рдХрд╛рд░ рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ - рдирд┐рдпрдВрддреНрд░рдХ рдФрд░ рд╕реЗрд▓ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реНрдХред
рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкреНрд░рджрд░реНрд╢рди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдПрдиреБрдо рдкреНрд░рд╕реНрддреБрддрд┐ рдкреНрд░рд╕реНрддреБрддрд┐ рдмрдирд╛рдПрдВред
рд╣рдо рдиреЗрд╡рд┐рдЧреЗрд╢рди рдмрд╛рд░ рдореЗрдВ рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рднреА рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред
class FruitsViewController: UICollectionViewController { private enum PresentationStyle: String, CaseIterable { case table case defaultGrid case customGrid var buttonImage: UIImage { switch self { case .table: return imageLiteral(resourceName: "table") case .defaultGrid: return imageLiteral(resourceName: "default_grid") case .customGrid: return imageLiteral(resourceName: "custom_grid") } } } private var selectedStyle: PresentationStyle = .table { didSet { updatePresentationStyle() } } private var datasource: [Fruit] = FruitsProvider.get() override func viewDidLoad() { super.viewDidLoad() self.collectionView.register(FruitCollectionViewCell.nib, forCellWithReuseIdentifier: FruitCollectionViewCell.reuseID) collectionView.contentInset = .zero updatePresentationStyle() navigationItem.rightBarButtonItem = UIBarButtonItem(image: selectedStyle.buttonImage, style: .plain, target: self, action: #selector(changeContentLayout)) } private func updatePresentationStyle() { navigationItem.rightBarButtonItem?.image = selectedStyle.buttonImage } @objc private func changeContentLayout() { let allCases = PresentationStyle.allCases guard let index = allCases.firstIndex(of: selectedStyle) else { return } let nextIndex = (index + 1) % allCases.count selectedStyle = allCases[nextIndex] } }
рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ UICollectionViewDelegateFlowLayout рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдирд┐рдпрдВрддреНрд░рдХ рд╕реЗ рдХрд┐рд╕реА рднреА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рддрддреНрд╡реЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдПрдВрдЧреЗред
рд╣рд╛рд▓рд╛рдВрдХрд┐, 2 рдмрд╛рд░реАрдХрд┐рдпрд╛рдВ рд╣реИрдВ:
- рдпрд╣ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реЗрд▓ рдЪрдпрди рд╡рд┐рдзрд┐ рдХрд╛ рд╡рд░реНрдгрди рднреА рдХрд░рддрд╛ рд╣реИ (didSelectItemAt :)
- рдХреБрдЫ рддрд░реАрдХреЛрдВ рдФрд░ рддрд░реНрдХ рд╕рднреА рдПрди рдореИрдкрд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрди = 3) рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рд╣рдо
CollectionViewSelectableItemDelegate рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирд╛рдПрдВрдЧреЗ, рдорд╛рдирдХ
UICollectionViewDelegateFlowLayout рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕реЗрд▓ рдЪрдпрди рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреБрдг рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рд╕реЗрд▓ рдкреНрд░рдХрд╛рд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ)ред рдЗрд╕рд╕реЗ рдкрд╣рд▓реА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
protocol CollectionViewSelectableItemDelegate: class, UICollectionViewDelegateFlowLayout { var didSelectItem: ((_ indexPath: IndexPath) -> Void)? { get set } }
рджреВрд╕рд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рддрд░реНрдХ рдХреЗ рджреЛрд╣рд░рд╛рд╡ рдХреЗ рд╕рд╛рде, рд╣рдо рд╕рднреА рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдЖрдзрд╛рд░ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВрдЧреЗ:
class DefaultCollectionViewDelegate: NSObject, CollectionViewSelectableItemDelegate { var didSelectItem: ((_ indexPath: IndexPath) -> Void)? let sectionInsets = UIEdgeInsets(top: 16.0, left: 16.0, bottom: 20.0, right: 16.0) func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { didSelectItem?(indexPath) } func collectionView(_ collectionView: UICollectionView, didHighlightItemAt indexPath: IndexPath) { let cell = collectionView.cellForItem(at: indexPath) cell?.backgroundColor = UIColor.clear } func collectionView(_ collectionView: UICollectionView, didUnhighlightItemAt indexPath: IndexPath) { let cell = collectionView.cellForItem(at: indexPath) cell?.backgroundColor = UIColor.white } }
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рддрд░реНрдХ рдПрдХ рд╕реЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп рдПрдХ рдмрдВрдж рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИ, рд╕рд╛рде рд╣реА
рд╣рд╛рдЗрд▓рд╛рдЗрдЯреЗрдб рд╕реНрдерд┐рддрд┐
рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдкрд░ рд╕реЗрд▓ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЛ рдмрджрд▓рдирд╛ рд╣реИред
рдЕрдЧрд▓рд╛, рд╣рдо рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХреЗ 3 рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ: рд╕рд╛рд░рдгреАрдмрджреНрдз, рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ 3 рддрддреНрд╡ рдФрд░ рдкрд╣рд▓реЗ рджреЛ рддрд░реАрдХреЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрдиред
рд╕рд╛рд░рдгреАрдмрджреНрдз :
class TabledContentCollectionViewDelegate: DefaultCollectionViewDelegate {
рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ 3 рддрддреНрд╡: class DefaultGriddedContentCollectionViewDelegate: DefaultCollectionViewDelegate { private let itemsPerRow: CGFloat = 3 private let minimumItemSpacing: CGFloat = 8
рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рддрд╛рд▓рд┐рдХрд╛ рдФрд░ 3x рдХрд╛ рд╕рдВрдпреЛрдЬрдиред class CustomGriddedContentCollectionViewDelegate: DefaultCollectionViewDelegate { private let itemsPerRow: CGFloat = 3 private let minimumItemSpacing: CGFloat = 8
рдЕрдВрддрд┐рдо рдЪрд░рдг рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рджреГрд╢реНрдп рдбреЗрдЯрд╛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИред
рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд┐рдВрджреБ: рдЪреВрдВрдХрд┐ рд╕рдВрдЧреНрд░рд╣ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐
рдХрдордЬреЛрд░ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рджреГрд╢реНрдп рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ
рдордЬрдмреВрдд рд▓рд┐рдВрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ, рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рднреА рдЙрдкрд▓рдмреНрдз рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рдПрдВ:
private var styleDelegates: [PresentationStyle: CollectionViewSelectableItemDelegate] = { let result: [PresentationStyle: CollectionViewSelectableItemDelegate] = [ .table: TabledContentCollectionViewDelegate(), .defaultGrid: DefaultGriddedContentCollectionViewDelegate(), .customGrid: CustomGriddedContentCollectionViewDelegate(), ] result.values.forEach { $0.didSelectItem = { _ in print("Item selected") } } return result }()
рдФрд░
UpdatePresentationStyle () рд╡рд┐рдзрд┐ рдореЗрдВ, рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдирд┐рдореЗрдЯреЗрдб рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛрдбрд╝реЗрдВ:
collectionView.delegate = styleDelegates[selectedStyle] collectionView.performBatchUpdates({ collectionView.reloadData() }, completion: nil)
рд╡рд╣ рд╕рдм рдЬреЛ рд╣рдорд╛рд░реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рджреГрд╢реНрдп рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдПрдирд┐рдореЗрдЯреЗрдб рд░реВрдк рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ :)
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЕрдм рдХрд┐рд╕реА рднреА рд╕реНрдХреНрд░реАрди рдкрд░ рддрддреНрд╡реЛрдВ рдХреЛ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐, рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд, рдХреЛрдб рд╕реНрд╡рддрдВрддреНрд░, рдкреБрди: рдкреНрд░рдпреЛрдЬреНрдп рдФрд░ рд╕реНрдХреЗрд▓реЗрдмрд▓ рд╣реИред
рдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛрдбред