ইউআইকোলিকেশনভিউ কলামগুলির সংখ্যা সেট করুন


101

আমি সবেমাত্র ইউআইকোলিকেশনভিউ সম্পর্কে শিখতে শুরু করেছি। আমি ভাবছি যদি কোনও সংগ্রহের ভিউতে কলামগুলির সংখ্যা নির্দিষ্ট করতে হয় তবে কেউ জানেন। ডিফল্টটি 3 (আইফোন / প্রতিকৃতি) এ সেট করা আছে। আমি ডকুমেন্টেশনটি দেখেছি এবং এর সংক্ষিপ্ত উত্তর খুঁজে পাচ্ছি না।


4
আমার কাছে এমন একটি অ্যাপ রয়েছে যা আমি UICollectionViewগ্রিড হিসাবে মূলত ব্যবহার করি কারণ আমি জানি যে আমি কেবল 4 টি কলাম চাই। আমি আমার কোষগুলিকে একটি নির্দিষ্ট আকার এবং এইগুলির মধ্যে ব্যবধান একটি নির্দিষ্ট আকার তৈরি করে এটি করি যাতে সংগ্রহের ভিউ কেবল 4 কলাম দেখায়, যাই হোক না কেন অভিমুখীকরণ হোক। এটি কি আপনার প্রয়োজন মতো?
jhilgert00

বা এটি কি সাধারণ প্রশ্নটির চেয়ে বেশি, আমি কীভাবে কলামের সংখ্যা গতিশীলভাবে সেট করতে পারি বা না?
jhilgert00

মূলত আমি পোর্ট্রেট মোডে 7 টি কলাম রাখছি। সুতরাং আমি কলামগুলির প্রস্থ 46px করেছি (320 পিক্স / 46px = 7)। আমি জানতাম না যে তাদের একটি ফাঁকা সম্পত্তি ছিল।
এসএনভি 7

উত্তর:


81

কালেকশনভিউগুলি খুব শক্তিশালী এবং এগুলি একটি দামে আসে। প্রচুর এবং প্রচুর বিকল্প। যেমন ওমজ বলেছেন:

একাধিক উপায়ে আপনি কলামগুলির সংখ্যা পরিবর্তন করতে পারেন

আমি <UICollectionViewDelegateFlowLayout>প্রোটোকলটি প্রয়োগ করার পরামর্শ দিচ্ছি , আপনাকে নিম্নলিখিত পদ্ধতিগুলিতে অ্যাক্সেস দিয়ে যা UICollectionViewসাবক্লাসিংয়ের প্রয়োজন ছাড়াই আপনার বিন্যাসের উপর আরও বেশি নিয়ন্ত্রণ রাখতে পারে:

  • collectionView:layout:insetForSectionAtIndex:
  • collectionView:layout:minimumInteritemSpacingForSectionAtIndex:
  • collectionView:layout:minimumLineSpacingForSectionAtIndex:
  • collectionView:layout:referenceSizeForFooterInSection:
  • collectionView:layout:referenceSizeForHeaderInSection:
  • collectionView:layout:sizeForItemAtIndexPath:

এছাড়াও, নিম্নোক্ত পদ্ধতিটি প্রয়োগ করা আপনার ইউআইকোলিকেশনভিউকে একটি ওরিয়েন্টেশন পরিবর্তনের উপর এটির লেআউটটি আপডেট করতে বাধ্য করবে: (বলুন আপনি ল্যান্ডস্কেপের জন্য কোষগুলিকে পুনরায় আকার দিতে এবং সেগুলি প্রসারিত করতে চেয়েছিলেন)

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
                               duration:(NSTimeInterval)duration{

    [self.myCollectionView.collectionViewLayout invalidateLayout];
}

অতিরিক্তভাবে, এখানে 2 টি ভাল টিউটোরিয়াল রয়েছে UICollectionViews:

http://www.raywenderlich.com/22324/beginning-uicollectionview-in-ios-6-part-12

http://skeuo.com/uicollectionview-custom-layout- টিউটোরিয়াল


4
এটি কি সমস্ত আইওএস ডিভাইসের জন্য কাজ করবে? collectionView:layout:sizeForItemAtIndexPath:সমস্ত ডিভাইসের জন্য আলাদাভাবে পরিচালনা করা উচিত ?
শরথ

4
@ শারথ অবশ্যই এটি সব কিছুর জন্য কাজ করে। আপনার গাণিতিকটি কেবল এমনভাবে করা দরকার যা সমস্ত ডিভাইসের জন্য উপযোগী;)। অভিযোজিত নকশা।
দ্য কোডিংআর্ট

বাহ এত মহান, কিন্তু বাস্তব উদাহরণ? অ্যান্ড্রয়েডে আমরা new GridLayoutManager(mContext, 4))(4 কলাম) করতে পারি , খুব সহজ, বা কেবল ব্যবহার করতে পারি LinearLayoutManager(এটিতে কেবল 1 টি কলাম রয়েছে)
ব্যবহারকারী 25

150

সুইফট 5 এবং আইওএস 12.3 এর সাথে, আপনি কীট এবং আকার পরিবর্তনগুলি (রোটেশন সহ) পরিচালনা করার সময় সারি প্রতি আইটেমের সংখ্যা নির্ধারণ করতে নিম্নলিখিত 4 টি প্রয়োগ ব্যবহার করতে পারেন UICollectionView


# 1 সাবক্লাসিং UICollectionViewFlowLayoutএবং UICollectionViewFlowLayoutএর itemSizeসম্পত্তি ব্যবহার করা

কলামফ্লোলয়আউট.ইউফিট:

import UIKit

class ColumnFlowLayout: UICollectionViewFlowLayout {

    let cellsPerRow: Int

    init(cellsPerRow: Int, minimumInteritemSpacing: CGFloat = 0, minimumLineSpacing: CGFloat = 0, sectionInset: UIEdgeInsets = .zero) {
        self.cellsPerRow = cellsPerRow
        super.init()

        self.minimumInteritemSpacing = minimumInteritemSpacing
        self.minimumLineSpacing = minimumLineSpacing
        self.sectionInset = sectionInset
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func prepare() {
        super.prepare()

        guard let collectionView = collectionView else { return }
        let marginsAndInsets = sectionInset.left + sectionInset.right + collectionView.safeAreaInsets.left + collectionView.safeAreaInsets.right + minimumInteritemSpacing * CGFloat(cellsPerRow - 1)
        let itemWidth = ((collectionView.bounds.size.width - marginsAndInsets) / CGFloat(cellsPerRow)).rounded(.down)
        itemSize = CGSize(width: itemWidth, height: itemWidth)
    }

    override func invalidationContext(forBoundsChange newBounds: CGRect) -> UICollectionViewLayoutInvalidationContext {
        let context = super.invalidationContext(forBoundsChange: newBounds) as! UICollectionViewFlowLayoutInvalidationContext
        context.invalidateFlowLayoutDelegateMetrics = newBounds.size != collectionView?.bounds.size
        return context
    }

}

সংগ্রহভিউকন্ট্রোলআর সুইফট:

import UIKit

class CollectionViewController: UICollectionViewController {

    let columnLayout = ColumnFlowLayout(
        cellsPerRow: 5,
        minimumInteritemSpacing: 10,
        minimumLineSpacing: 10,
        sectionInset: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
    )

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView?.collectionViewLayout = columnLayout
        collectionView?.contentInsetAdjustmentBehavior = .always
        collectionView?.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 59
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        cell.backgroundColor = UIColor.orange
        return cell
    }

}

এখানে চিত্র বর্ণনা লিখুন


# 2 UICollectionViewFlowLayoutএর itemSizeপদ্ধতি ব্যবহার করে

import UIKit

class CollectionViewController: UICollectionViewController {

    let margin: CGFloat = 10
    let cellsPerRow = 5

    override func viewDidLoad() {
        super.viewDidLoad()

        guard let collectionView = collectionView, let flowLayout = collectionViewLayout as? UICollectionViewFlowLayout else { return }

        flowLayout.minimumInteritemSpacing = margin
        flowLayout.minimumLineSpacing = margin
        flowLayout.sectionInset = UIEdgeInsets(top: margin, left: margin, bottom: margin, right: margin)

        collectionView.contentInsetAdjustmentBehavior = .always
        collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
    }

    override func viewWillLayoutSubviews() {
        guard let collectionView = collectionView, let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else { return }
        let marginsAndInsets = flowLayout.sectionInset.left + flowLayout.sectionInset.right + collectionView.safeAreaInsets.left + collectionView.safeAreaInsets.right + flowLayout.minimumInteritemSpacing * CGFloat(cellsPerRow - 1)
        let itemWidth = ((collectionView.bounds.size.width - marginsAndInsets) / CGFloat(cellsPerRow)).rounded(.down)
        flowLayout.itemSize =  CGSize(width: itemWidth, height: itemWidth)
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 59
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        cell.backgroundColor = UIColor.orange
        return cell
    }

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        collectionView?.collectionViewLayout.invalidateLayout()
        super.viewWillTransition(to: size, with: coordinator)
    }

}

# 3 UICollectionViewDelegateFlowLayoutএর collectionView(_:layout:sizeForItemAt:)পদ্ধতি ব্যবহার করে

import UIKit

class CollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {

    let inset: CGFloat = 10
    let minimumLineSpacing: CGFloat = 10
    let minimumInteritemSpacing: CGFloat = 10
    let cellsPerRow = 5

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView?.contentInsetAdjustmentBehavior = .always
        collectionView?.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets(top: inset, left: inset, bottom: inset, right: inset)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return minimumLineSpacing
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return minimumInteritemSpacing
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let marginsAndInsets = inset * 2 + collectionView.safeAreaInsets.left + collectionView.safeAreaInsets.right + minimumInteritemSpacing * CGFloat(cellsPerRow - 1)
        let itemWidth = ((collectionView.bounds.size.width - marginsAndInsets) / CGFloat(cellsPerRow)).rounded(.down)
        return CGSize(width: itemWidth, height: itemWidth)
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 59
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        cell.backgroundColor = UIColor.orange
        return cell
    }

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        collectionView?.collectionViewLayout.invalidateLayout()
        super.viewWillTransition(to: size, with: coordinator)
    }

}

# 4 সাবক্লাসিং UICollectionViewFlowLayoutএবং UICollectionViewFlowLayoutএর estimatedItemSizeসম্পত্তি ব্যবহার করা

সংগ্রহভিউকন্ট্রোলআর সুইফট:

import UIKit

class CollectionViewController: UICollectionViewController {

    let items = [
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
        "Lorem ipsum dolor sit amet, consectetur.",
        "Lorem ipsum dolor sit amet.",
        "Lorem ipsum dolor sit amet, consectetur.",
        "Lorem ipsum dolor sit amet, consectetur adipiscing.",
        "Lorem ipsum.",
        "Lorem ipsum dolor sit amet.",
        "Lorem ipsum dolor sit.",
        "Lorem ipsum dolor sit amet, consectetur adipiscing.",
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit.",
        "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor.",
        "Lorem ipsum dolor sit amet, consectetur."
    ]

    let columnLayout = FlowLayout(
        cellsPerRow: 3,
        minimumInteritemSpacing: 10,
        minimumLineSpacing: 10,
        sectionInset: UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
    )

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView?.collectionViewLayout = columnLayout
        collectionView?.contentInsetAdjustmentBehavior = .always
        collectionView?.register(Cell.self, forCellWithReuseIdentifier: "Cell")
    }

    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return items.count
    }

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! Cell
        cell.label.text = items[indexPath.row]
        return cell
    }

    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        collectionView?.collectionViewLayout.invalidateLayout()
        super.viewWillTransition(to: size, with: coordinator)
    }

}

ফ্লোএলআউট.সুইফ্ট:

import UIKit

class FlowLayout: UICollectionViewFlowLayout {

    let cellsPerRow: Int

    required init(cellsPerRow: Int = 1, minimumInteritemSpacing: CGFloat = 0, minimumLineSpacing: CGFloat = 0, sectionInset: UIEdgeInsets = .zero) {
        self.cellsPerRow = cellsPerRow

        super.init()

        self.minimumInteritemSpacing = minimumInteritemSpacing
        self.minimumLineSpacing = minimumLineSpacing
        self.sectionInset = sectionInset
        estimatedItemSize = UICollectionViewFlowLayout.automaticSize
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
        guard let layoutAttributes = super.layoutAttributesForItem(at: indexPath) else { return nil }
        guard let collectionView = collectionView else { return layoutAttributes }

        let marginsAndInsets = collectionView.safeAreaInsets.left + collectionView.safeAreaInsets.right + sectionInset.left + sectionInset.right + minimumInteritemSpacing * CGFloat(cellsPerRow - 1)
        layoutAttributes.bounds.size.width = ((collectionView.bounds.width - marginsAndInsets) / CGFloat(cellsPerRow)).rounded(.down)

        return layoutAttributes
    }

    override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
        let superLayoutAttributes = super.layoutAttributesForElements(in: rect)!.map { $0.copy() as! UICollectionViewLayoutAttributes }
        guard scrollDirection == .vertical else { return superLayoutAttributes }

        let layoutAttributes = superLayoutAttributes.compactMap { layoutAttribute in
            return layoutAttribute.representedElementCategory == .cell ? layoutAttributesForItem(at: layoutAttribute.indexPath) : layoutAttribute
        }

        // (optional) Uncomment to top align cells that are on the same line
        /*
        let cellAttributes = layoutAttributes.filter({ $0.representedElementCategory == .cell })
        for (_, attributes) in Dictionary(grouping: cellAttributes, by: { ($0.center.y / 10).rounded(.up) * 10 }) {
            guard let max = attributes.max(by: { $0.size.height < $1.size.height }) else { continue }
            for attribute in attributes where attribute.size.height != max.size.height {
                attribute.frame.origin.y = max.frame.origin.y
            }
        }
         */

        // (optional) Uncomment to bottom align cells that are on the same line
        /*
        let cellAttributes = layoutAttributes.filter({ $0.representedElementCategory == .cell })
        for (_, attributes) in Dictionary(grouping: cellAttributes, by: { ($0.center.y / 10).rounded(.up) * 10 }) {
            guard let max = attributes.max(by: { $0.size.height < $1.size.height }) else { continue }
            for attribute in attributes where attribute.size.height != max.size.height {
                attribute.frame.origin.y += max.frame.maxY - attribute.frame.maxY
            }
        }
         */

        return layoutAttributes
    }

}

সেল.সুইফ্ট:

import UIKit

class Cell: UICollectionViewCell {

    let label = UILabel()

    override init(frame: CGRect) {
        super.init(frame: frame)

        label.numberOfLines = 0
        backgroundColor = .orange
        contentView.addSubview(label)

        label.translatesAutoresizingMaskIntoConstraints = false
        label.topAnchor.constraint(equalTo: contentView.layoutMarginsGuide.topAnchor).isActive = true
        label.leadingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.leadingAnchor).isActive = true
        label.trailingAnchor.constraint(equalTo: contentView.layoutMarginsGuide.trailingAnchor).isActive = true
        label.bottomAnchor.constraint(equalTo: contentView.layoutMarginsGuide.bottomAnchor).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
        layoutIfNeeded()
        label.preferredMaxLayoutWidth = label.bounds.size.width
        layoutAttributes.bounds.size.height = contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
        return layoutAttributes
    }

    // Alternative implementation
    /*
    override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
        label.preferredMaxLayoutWidth = layoutAttributes.size.width - contentView.layoutMargins.left - contentView.layoutMargins.right
        layoutAttributes.bounds.size.height = contentView.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize).height
        return layoutAttributes
    }
    */

}

এখানে চিত্র বর্ণনা লিখুন


4
যে সমাধানগুলি "ভিউউইলট্রান্সিশন (আকারে ..." ব্যবহার করে সেগুলি ডিভাইস রোটেশনকে সঠিকভাবে পরিচালনা করে না Since ফ্রেম সেট হওয়ার আগেই এটি ডেকে আনা হয়েছে বলে সংগ্রহের পুরানো মাত্রা ঘরের আকার গণনা করার জন্য ব্যবহৃত হয় ((চেষ্টা করা হয়নি) এখনো অন্যান্য সমাধানের)
উপত্যকা

4
আমি সমাধান # 1 ব্যবহার করেছি, আপনি আমার নতুন নায়ক।
টম ওয়াল্টার্স

4
আমি আপনার সমাধানটি # 1 ব্যবহার করেছি। এটি দুর্দান্ত।
শাহিল

4
দুর্দান্ত এবং সম্পূর্ণ উত্তর, # 2
নেতৃত্বে

4
সমাধান # 1 নিখুঁত! অবদানের জন্য আপনাকে ধন্যবাদ!
ব্রায়ান

61

আমি আমার প্রয়োগ UICollectionViewDelegateFlowLayoutকরেছিলাম UICollectionViewControllerএবং কক্ষের আকার নির্ধারণের জন্য দায়ী পদ্ধতিটি ওভাররাইড করি । আমি তখন পর্দার প্রস্থ নিয়েছি এবং এটি আমার কলামের প্রয়োজনীয়তার সাথে ভাগ করেছি। উদাহরণস্বরূপ, আমি প্রতিটি পর্দার আকারে 3 টি কলাম রাখতে চাইছি। সুতরাং আমার কোডটি কেমন দেখাচ্ছে তা এখানে -

- (CGSize)collectionView:(UICollectionView *)collectionView
                  layout:(UICollectionViewLayout *)collectionViewLayout
  sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CGRect screenRect = [[UIScreen mainScreen] bounds];
    CGFloat screenWidth = screenRect.size.width;
    float cellWidth = screenWidth / 3.0; //Replace the divisor with the column count requirement. Make sure to have it in float.
    CGSize size = CGSizeMake(cellWidth, cellWidth);

    return size;
}

4
খুব সহজ,
বোকামি

4
পরিবর্তে প্রতি সারিতে এন -1 উচ্চ ব্যবধানযুক্ত আইটেম এড়াতে আপনার আইটেম স্পেসিং 0 তে সেট করা নিশ্চিত করা উচিত।
জো

41

নুব এর উত্তরে প্রসারিত:

func collectionView(collectionView: UICollectionView,
    layout collectionViewLayout: UICollectionViewLayout,
    sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

        let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
        let totalSpace = flowLayout.sectionInset.left
            + flowLayout.sectionInset.right
            + (flowLayout.minimumInteritemSpacing * CGFloat(numberOfItemsPerRow - 1))
        let size = Int((collectionView.bounds.width - totalSpace) / CGFloat(numberOfItemsPerRow))
        return CGSize(width: size, height: size)
}

এটি কোষগুলির মধ্যে যে কোনও ব্যবধানের অনুমতি দেয়। এটি একটি Intসদস্য ভেরিয়েবল হিসাবে পরিচিত numberOfItemsPerRowএবং এটি সমস্ত কক্ষগুলি বর্গক্ষেত্র এবং একই আকারের হিসাবে ধরে নেয়। Jhilgert00 এর উত্তরে উল্লিখিত হিসাবে আমাদের অবশ্যই ওরিয়েন্টেশন পরিবর্তনের ক্ষেত্রে প্রতিক্রিয়া দেখাতে হবে, তবে এখন হ'ল অবহেলিত viewWillTransitionToSizeহিসাবে ব্যবহার করে willRotateToInterfaceOrientation


আকার = ইন্টি ((কালেকশনভিউ.বাউন্ডস.উইথ - টোটালস্পেস) / সিজিফ্লোয়াট (নম্বরঅফিটসাম্পাররো)) - আপনাকে ইন্টারে কাস্টিং অপসারণ করা উচিত, কারণ কিছু ক্ষেত্রে এটি কোষগুলির মধ্যে ছোট স্পেস তৈরি করে
মাকালেলে

14

দ্বি-কলামের লেআউট থাকতে এখানে সুইফট 3 এর কার্যকারী কোডটি রয়েছে:

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {

    let nbCol = 2

    let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
    let totalSpace = flowLayout.sectionInset.left
        + flowLayout.sectionInset.right
        + (flowLayout.minimumInteritemSpacing * CGFloat(nbCol - 1))
    let size = Int((collectionView.bounds.width - totalSpace) / CGFloat(nbCol))
    return CGSize(width: size, height: size)
}

আপনার পছন্দসই সংখ্যক কলামগুলিতে "এনবি কল" পরিবর্তন করতে দ্বিধা বোধ করবেন।


ইনসেটগুলি (1.0,1.0,1.0,1.0) হলে প্রতিটি সমাধানের সাথে কী ভুল হয়, এই ক্ষেত্রে লেআউটটি 1 কলামে পরিণত হয়!
rd_

@ ফ্রাকসুল দুর্দান্ত উত্তর, তবে আমি যদি ডিভাইসটি ফ্লিপ করি তবে লেআউটটি পুনরায় সেট করা হয় ... এর জন্য কোনও সমাধান?
মাকসিম নাইয়াজেভ 4:48

8

যদি আপনি ডেলিগেট ব্যবহার করে অলস হন।

extension UICollectionView {
    func setItemsInRow(items: Int) {
        if let layout = self.collectionViewLayout as? UICollectionViewFlowLayout {
            let contentInset = self.contentInset
            let itemsInRow: CGFloat = CGFloat(items);
            let innerSpace = layout.minimumInteritemSpacing * (itemsInRow - 1.0)
            let insetSpace = contentInset.left + contentInset.right + layout.sectionInset.left + layout.sectionInset.right
            let width = floor((CGRectGetWidth(frame) - insetSpace - innerSpace) / itemsInRow);
            layout.itemSize = CGSizeMake(width, width)
        }
    }
}

PS: খুব ঘোরার পরেও ডাকা উচিত


4
এটি সুইফট ৪.০ এও কাজ করে ... শেষ দুটি লাইনের পরিবর্তনের পরে: প্রস্থ = তল (ফ্রেমউইউথ - ইনসেটস্পেস - ইনটারস্পেস) / আইটেমআইনরো) লেআউট.ইটিমসাইজ = সিজি সাইজ (প্রস্থ: প্রস্থ, উচ্চতা: প্রস্থ)
g212gs

8

সুইফট 3 এ আপডেট হয়েছে:

প্রবাহ বিন্যাসের পরিবর্তে, আমি নির্দিষ্ট কলাম নম্বর এবং সারি সংখ্যার জন্য কাস্টম লেআউট ব্যবহার করতে পছন্দ করি। কারণ:

  1. কলাম সংখ্যাটি খুব বড় হলে এটি অনুভূমিকভাবে টেনে আনতে পারেন।
  2. এটি কলাম এবং সারি ব্যবহার করার কারণে যুক্তিসঙ্গতভাবে আরও গ্রহণযোগ্য।

সাধারণ সেল এবং শিরোনাম ঘর: (ইউআইবিবেলকে আইবিআউটলেট হিসাবে আপনার এক্সিবায় যোগ করুন):

class CollectionViewCell: UICollectionViewCell {

@IBOutlet weak var label: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    self.backgroundColor = UIColor.black
    label.textColor = UIColor.white
}
}

class CollectionViewHeadCell: UICollectionViewCell {

@IBOutlet weak var label: UILabel!

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
    self.backgroundColor = UIColor.darkGray
    label.textColor = UIColor.white
}
}

কাস্টম বিন্যাস:

let cellHeight: CGFloat = 100
let cellWidth: CGFloat = 100

class CustomCollectionViewLayout: UICollectionViewLayout {
    private var numberOfColumns: Int!
    private var numberOfRows: Int!

    // It is two dimension array of itemAttributes
    private var itemAttributes = [[UICollectionViewLayoutAttributes]]()
    // It is one dimension of itemAttributes
    private var cache = [UICollectionViewLayoutAttributes]()

override func prepare() {
    if self.cache.isEmpty {

        self.numberOfColumns = self.collectionView?.numberOfItems(inSection: 0)
        self.numberOfRows = self.collectionView?.numberOfSections

        // Dynamically change cellWidth if total cell width is smaller than whole bounds
        /* if (self.collectionView?.bounds.size.width)!/CGFloat(self.numberOfColumns) > cellWidth {
         self.cellWidth = (self.collectionView?.bounds.size.width)!/CGFloat(self.numberOfColumns)
         }
         */
        for row in 0..<self.numberOfRows {
            var row_temp = [UICollectionViewLayoutAttributes]()
            for column in 0..<self.numberOfColumns {

                let indexPath = NSIndexPath(item: column, section: row)

                let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath as IndexPath)
                attributes.frame = CGRect(x: cellWidth*CGFloat(column), y: cellHeight*CGFloat(row), width: cellWidth, height: cellHeight)

                row_temp.append(attributes)

                self.cache.append(attributes)
            }
            self.itemAttributes.append(row_temp)
        }
    }
}
override var collectionViewContentSize: CGSize {
    return CGSize(width: CGFloat(self.numberOfColumns)*cellWidth, height: CGFloat(self.numberOfRows)*cellHeight)
}

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {

    var layoutAttributes = [UICollectionViewLayoutAttributes]()

    for attributes in cache {
        if attributes.frame.intersects(rect) {
            layoutAttributes.append(attributes)
        }
    }
    return layoutAttributes
}
}

সংগ্রহ ভিউ:

let CellIdentifier = "CellIdentifier"
let HeadCellIdentifier = "HeadCellIdentifier"

class CollectionView: UICollectionView, UICollectionViewDelegate, UICollectionViewDataSource {

init() {
    let layout = CustomCollectionViewLayout()

    super.init(frame: CGRect.zero, collectionViewLayout: layout)

    self.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: CellIdentifier)
    self.register(UINib(nibName: "CollectionViewHeadCell", bundle: nil), forCellWithReuseIdentifier: HeadCellIdentifier)

    self.isDirectionalLockEnabled = true
    self.dataSource = self
    self.delegate = self
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

func updateCollectionView() {
    DispatchQueue.main.async {
        self.reloadData()
    }
}

// MARK: CollectionView datasource
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 20
}
func numberOfSections(in collectionView: UICollectionView) -> Int {
    return 20
}
override func numberOfItems(inSection section: Int) -> Int {
    return 20
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    let column = (indexPath as NSIndexPath).row
    let row = (indexPath as NSIndexPath).section

    if column == 0 {
        let cell : CollectionViewHeadCell = collectionView.dequeueReusableCell(withReuseIdentifier: HeadCellIdentifier, for: indexPath) as! CollectionViewHeadCell

        cell.label.text = "\(row)"

        return cell
    }
    else if row == 0 {
        let cell : CollectionViewHeadCell = collectionView.dequeueReusableCell(withReuseIdentifier: HeadCellIdentifier, for: indexPath) as! CollectionViewHeadCell

        cell.label.text = "\(column)"

        return cell
    }
    else {
        let cell : CollectionViewCell = collectionView.dequeueReusableCell(withReuseIdentifier: CellIdentifier, for: indexPath) as! CollectionViewCell

        cell.label.text = String(format: "%d", arguments: [indexPath.section*indexPath.row])

        return cell
    }
}

// MARK: CollectionView delegate
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {

    let column = (indexPath as NSIndexPath).row
    let row = (indexPath as NSIndexPath).section

    print("\(column)  \(row)")
}
}

ভিউকন্ট্রোলার থেকে সংগ্রহ ভিউ ব্যবহার করুন:

class ViewController: UIViewController {
let collectionView = CollectionView()

override func viewDidLoad() {
    collectionView.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(collectionView)
    self.view.backgroundColor = UIColor.red

    self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[collectionView]|", options: [], metrics: nil, views: ["collectionView": collectionView]))
    self.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[collectionView]|", options: [], metrics: nil, views: ["collectionView": collectionView]))
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

    collectionView.updateCollectionView()
}
}

অবশেষে আপনি অভিনব কালেকশন ভিউ করতে পারেন!

এখানে চিত্র বর্ণনা লিখুন


এই সমাধানটি গ্রহণে সমস্যাটি হ'ল আপনার স্থির উচ্চতা এবং প্রস্থ
rd_

4
@rd_Custom বিন্যাসের অর্থ আপনি যা করতে চান তা করতে পারেন! আমার কোডটি কেবল সর্বাধিক সহজ
কেসটি দেখায়

7

কারণ UICollectionView খুব নমনীয়, আপনি যে ধরণের লেআউট ব্যবহার করেন তার উপর নির্ভর করে আপনি একাধিক উপায় কলামগুলির সংখ্যা পরিবর্তন করতে পারেন।

UICollectionViewFlowLayoutসরাসরি কলামের সংখ্যা নির্দিষ্ট করে না (কারণ এটি দেখতে আকার / স্থিতিবিন্যাস উপর নির্ভর করে) (সম্ভবত কি আপনার সাথে কাজ করছি)। এটিকে পরিবর্তন করার সহজতম উপায় হ'ল itemSizeসম্পত্তি এবং / অথবা minimumInteritemSpacing/ সেট করা minimumLineSpacing


5

সুইফ্ট 5+ আইওএস 13 এ আপডেট হয়েছে

সংগ্রহের ভিউ প্রাক্কলনের আকার অবশ্যই কোনও নয় must

এখানে চিত্র বর্ণনা লিখুন

ঘরের জন্য মার্জিন ঘোষণা করুন

let margin: CGFloat = 10

ViewDidLoad কনফিগার ইন minimumInteritemSpacing, minimumLineSpacing,sectionInset

 guard let collectionView = docsColl, let flowLayout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout else { return }

    flowLayout.minimumInteritemSpacing = margin
    flowLayout.minimumLineSpacing = margin
    flowLayout.sectionInset = UIEdgeInsets(top: margin, left: margin, bottom: margin, right: margin)

ইউআইকোলিকেশনভিউ ডেটা সোর্স পদ্ধতিsizeForItemAt

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {

    let noOfCellsInRow = 2   //number of column you want
    let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
    let totalSpace = flowLayout.sectionInset.left
        + flowLayout.sectionInset.right
        + (flowLayout.minimumInteritemSpacing * CGFloat(noOfCellsInRow - 1))

    let size = Int((collectionView.bounds.width - totalSpace) / CGFloat(noOfCellsInRow))
    return CGSize(width: size, height: size)
}

4

সুইফট 3.0। উভয় অনুভূমিক এবং উল্লম্ব স্ক্রোল দিকনির্দেশ এবং ভেরিয়েবল স্পেসিংয়ের জন্য কাজ করে

কলামগুলির সংখ্যা উল্লেখ করুন

let numberOfColumns: CGFloat = 3

flowLayoutনির্দিষ্ট রেন্ডার কনফিগার করুনnumberOfColumns

if let flowLayout = collectionView?.collectionViewLayout as? UICollectionViewFlowLayout {
    let horizontalSpacing = flowLayout.scrollDirection == .vertical ? flowLayout.minimumInteritemSpacing : flowLayout.minimumLineSpacing
    let cellWidth = (collectionView.frame.width - max(0, numberOfColumns - 1)*horizontalSpacing)/numberOfColumns
    flowLayout.itemSize = CGSize(width: cellWidth, height: cellWidth)
}

এই সমস্ত দীর্ঘ উত্তর সর্বত্রই রয়েছে এবং এটি 5 টি লাইন কোডের সাথে কাজ করে :)
জে ডঃ

4
ভাল চেষ্টা। তবে আপনি সংগ্রহেভিউলয়আউটে কোনও বিভাগটি ইনসেট ব্যবহার করেন তবে এটি কাজ করবে না। এটির সমাধানের জন্য, (1) সেল প্রস্থ গ্রহণ করে এবং এ থেকে ফ্লোলয়আউট.সেকশনইনসেট.লেফট এবং ফ্লোলায়আউট.সেকশনআইনেস.সাইট বিয়োগ করে উপলব্ধ প্রস্থটি গণনা করুন। (২) আপনি যেখানে সেলভিডথ গণনা করেন সেখানে 'ভিউ.ফ্রেম.উইথথ' প্রতিস্থাপন করুন (1) এ গণনা করা মানের সাথে। এছাড়াও, মনে রাখবেন যে ভিউর ফ্রেমটি কেবল লোড হওয়ার পরে চূড়ান্ত হবে, এবং পরিবর্তিত হতে পারে, সুতরাং আপনার প্রয়োজন অনুসারে লেআউটটি পুনর্নির্মাণ করতে হবে।
Womble

2

আপনি আঁকতে চান লেআউটটি সম্পর্কে এটি। আপনি ইউআইকোলিকেশনভিউফ্লোলোআউট থেকে কাস্টম ক্লাস উত্তরাধিকারসূত্রে তৈরি করতে পারেন। বর্তমানে কলাম সেট করার জন্য সরাসরি কোনও পদ্ধতি নেই। আপনি যদি এই ধরণের কার্যকারিতা অর্জন করতে চান তবে আপনাকে এটি ম্যানুয়ালি করতে হবে। আপনার এটি আপনার কাস্টম ফ্লো লেআউট শ্রেণিতে পরিচালনা করতে হবে।

এখন প্রশ্ন উঠবে আপনি কীভাবে এটি করবেন? আপনি যদি সেল ফ্রেমকে ঝামেলা করতে না চান তবে আপনি সামঞ্জস্য করতে পারেন

 collectionView:layout:minimumInteritemSpacingForSectionAtIndex:
 collectionView:layout:minimumLineSpacingForSectionAtIndex:

আর একটি উপায় হ'ল আপনাকে নিজের কক্ষের নিজস্ব অবস্থান সরবরাহ করা। দুটি পদ্ধতির নীচে ওভাররাইড করে যা আপনার বিন্যাস গঠনের সময় ডাকা হবে।

  - (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect
  - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)path

ইউআইকোলিকেশনভিউলয়আউটঅ্যাট্রিবিউটস এমন একটি শ্রেণী যা কোষের অবস্থান, ফ্রেম, জিনডেক্স ইত্যাদি নিয়ে কাজ করবে


2

এই উত্তরটি দ্রুততম 3.0 -> এর জন্য

প্রথম প্রোটোকল অনুসারে:

 UICollectionViewDelegateFlowLayout

তারপরে এই পদ্ধতিগুলি যুক্ত করুন:

    //this method is for the size of items      
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        let width = collectionView.frame.width/3
        let height : CGFloat = 160.0
        return CGSize(width: width, height: height)
    }
    //these methods are to configure the spacing between items

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsetsMake(0,0,0,0)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
        return 0
    }

1

আমি কেবল # 2 ইমানু পেটাইটের উত্তর যুক্ত করতে চেয়েছি। মার্জিনগুলি পর্দার প্রস্থ নির্বিশেষে যথাযথ হয় তা নিশ্চিত করার জন্য, আমি একটি পছন্দসই মার্জিন সহ একটি পুনরাবৃত্তীয় দ্রাবক এবং ইনপুট হিসাবে কলামগুলির # ব্যবহার করি। আমি তাদের লক্ষের সাথে চূড়ান্ত মার্জিনের তুলনা করা হবে সেখানে একটি দিকনির্দেশক পতাকাও যুক্ত করেছি।

পুনরাবৃত্তাকারী solver নীচে প্রদর্শিত হয় এবং সেলউইথ এবং মার্জিন প্রদান করে returns

private func iterativeCellSpacing(targetMargins : CGFloat,
                                  cellsPerRow : Int,
                                  isMinTarget : Bool) -> (CGFloat, CGFloat)
{
    var w : CGFloat = 0
    var m : CGFloat = targetMargins
    let cols : CGFloat = CGFloat(cellsPerRow)

    let numMargins : CGFloat = cols + 1.0
    let screenWidth : CGFloat = collectionView!.bounds.size.width


    var delta = CGFloat.greatestFiniteMagnitude
    while abs(delta) > 0.001
    {
        let totalMarginSpacing = numMargins * m
        let totalCellSpacing = screenWidth - totalMarginSpacing

        if (isMinTarget)
        {
            w = floor(totalCellSpacing / cols)
            m = ceil((screenWidth - cols * w) / numMargins)
        }
        else
        {
            w = ceil(totalCellSpacing / cols)
            m = floor((screenWidth - cols * w) / numMargins)
        }

        delta = screenWidth - w * CGFloat(cellsPerRow) - m * numMargins
    }

    return (w, m)
}

আমি এটিকে এটি বলেছি:

fileprivate var margin: CGFloat = 20
fileprivate var cellWidth : CGFloat = 80
fileprivate let cellsPerRow = 4

override func viewDidLoad()
{
    super.viewDidLoad()

    (cellWidth, margin) = iterativeCellSpacing(targetMargins: margin, cellsPerRow: 4, isMinTarget: true)
    ...
}

আমি তারপরে প্রবাহ বিন্যাসে সেলউইথ এবং মার্জিন মানগুলি প্রয়োগ করি:

extension MyCollectionController : UICollectionViewDelegateFlowLayout

{ফানেক কালেকশনভিউ (_ কালচারভিউ: ইউআইকোলিকেশনভিউ, লেআউট কালেকশনভিউ লেআউট: ইউআইকোলিকেশনভিউ লেলআউট, সাইজফর্ট আইটেমটেক্স ইনডেক্সপথ: ইনডেক্সপথ) -> সিজি সাইজ {রিটার্ন সিজি সাইজ (প্রস্থ: সেলউইথ, উচ্চতা: সেলউথ)}

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
    collectionView?.collectionViewLayout.invalidateLayout()
    super.viewWillTransition(to: size, with: coordinator)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets
{
    return UIEdgeInsetsMake(margin, margin, margin, margin)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat
{
    return margin
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat
{
    return margin
}

}

আশাকরি এটা সাহায্য করবে. মার্জিনগুলি হুবহু নিশ্চিত করার একটি সহজ উপায় সম্ভবত রয়েছে তবে এটি একটি পদ্ধতি। এছাড়াও, এই কোডটি এমন ডিভাইসগুলির জন্য পরীক্ষা করা হয়নি যা সংগ্রহের দর্শন ঘোরানোর অনুমতি দেয়।

ধন্যবাদ,


0

নিখুঁত সমাধানটি ইউআইসিএলেকশনভিউডেলিগেটফ্লোএলআউট ব্যবহার করা তবে আপনি সহজেই ঘরের প্রস্থ গণনা করতে পারেন এবং আপনার পছন্দসই কলামগুলির পছন্দসই সংখ্যায় বিভক্ত করতে পারেন

কৌশলটি হ'ল কোনও ভগ্নাংশ ছাড়াই প্রস্থ তৈরি করা

(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath

{
 CGFloat screenWidth = self.view.frame.size.width;
   CGFloat marginWidth = (screenWidth - collectionView.frame.size.width);


   CGFloat cellWith = (collectionView.frame.size.width - marginWidth )/3;
   cellWith= floorf(cellWith);




  CGSize retval = CGSizeMake(cellWith,cellWith);


  return retval;}

0

আমি একটি সংগ্রহের বিন্যাস তৈরি করেছি।

বিভাজকটি দৃশ্যমান করতে সংগ্রহের পটভূমির রঙ ধূসরতে সেট করুন। প্রতি বিভাগে এক সারি।

ব্যবহার:

let layout = GridCollectionViewLayout()
layout.cellHeight = 50 // if not set, cellHeight = Collection.height/numberOfSections
layout.cellWidth = 50  // if not set, cellWidth = Collection.width/numberOfItems(inSection)
collectionView.collectionViewLayout = layout

বিন্যাস:

import UIKit

class GridCollectionViewLayout: UICollectionViewLayout {


var cellWidth : CGFloat = 0
var cellHeight : CGFloat = 0
var seperator: CGFloat = 1

private var cache = [UICollectionViewLayoutAttributes]()



override func prepare() {

    guard let collectionView = self.collectionView else {
        return
    }

    self.cache.removeAll()



        let numberOfSections = collectionView.numberOfSections

        if cellHeight <= 0
        {
            cellHeight = (collectionView.bounds.height - seperator*CGFloat(numberOfSections-1))/CGFloat(numberOfSections)
        }

        for section in 0..<collectionView.numberOfSections {

            let numberOfItems = collectionView.numberOfItems(inSection: section)

            let cellWidth2 : CGFloat
            if cellWidth <= 0
            {
                cellWidth2 = (collectionView.bounds.width - seperator*CGFloat(numberOfItems-1))/CGFloat(numberOfItems)
            }
            else
            {
                cellWidth2 = cellWidth
            }


            for row in 0..<numberOfItems {


                let indexPath = NSIndexPath(row: row, section: section)

                let attributes = UICollectionViewLayoutAttributes(forCellWith: indexPath as IndexPath)
                attributes.frame = CGRect(x: (cellWidth2+seperator)*CGFloat(row),
                                          y: (cellHeight+seperator)*CGFloat(section),
                                          width: cellWidth2,
                                          height: cellHeight)

                //row_temp.append(attributes)

                self.cache.append(attributes)
            }
            //self.itemAttributes.append(row_temp)
        }

}

override var collectionViewContentSize: CGSize {

    guard let collectionView = collectionView else
    {
        return CGSize.zero
    }

    if (collectionView.numberOfSections <= 0)
    {
        return collectionView.bounds.size
    }

    let width:CGFloat
    if cellWidth <= 0
    {
        width = collectionView.bounds.width
    }
    else
    {
        width = cellWidth*CGFloat(collectionView.numberOfItems(inSection: 0))
    }

    let numberOfSections = CGFloat(collectionView.numberOfSections)
    var height:CGFloat = 0
    height += numberOfSections * cellHeight
    height += (numberOfSections - 1) * seperator



    return CGSize(width: width, height: height)
}

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {

    var layoutAttributes = [UICollectionViewLayoutAttributes]()

    for attributes in cache {
        if attributes.frame.intersects(rect) {
            layoutAttributes.append(attributes)
        }
    }
    return layoutAttributes
}

override func layoutAttributesForItem(at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
    return cache[indexPath.item]
}
}

0

এটি ব্যবহার করে দেখুন, এটি আমার জন্য নিখুঁতভাবে কাজ করছে,

নীচের পদক্ষেপগুলি অনুসরণ করুন:

1. .h ফাইলে মান নির্ধারণ করুন।

     #define kNoOfColumsForCollection 3
     #define kNoOfRowsForCollection 4
     #define kcellSpace 5
     #define kCollectionViewCellWidth (self.view.frame.size.width - kcellSpace*kNoOfColumsForCollection)/kNoOfColumsForCollection
     #define kCollectionViewCellHieght (self.view.frame.size.height-40- kcellSpace*kNoOfRowsForCollection)/kNoOfRowsForCollection

বা

  #define kNoOfColumsForCollection 3
  #define kCollectionViewCellWidthHieght (self.view.frame.size.width - 6*kNoOfColumsForCollection)/kNoOfColumsForCollection

2. সংগ্রহে কোড যুক্ত করুন নিচের মতো লেআউট ডেটা উত্স পদ্ধতিগুলি দেখুন,

 #pragma mark Collection View Layout data source methods
// collection view with autolayout

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
{
return 4;
}

- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
 {
 return 1;
}

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
return UIEdgeInsetsMake(4, 4, 4, 4);
}
- (CGSize)collectionView:(UICollectionView *)collectionView
              layout:(UICollectionViewLayout *)collectionViewLayout
   sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
 return 
 CGSizeMake(kCollectionViewCellWidth,kCollectionViewCellHieght);
 // CGSizeMake (kCollectionViewCellWidthHieght,kCollectionViewCellWidthHieght);
}

আশা করি এটি কারওর জন্য সহায়ক হবে।


0

প্রোটোকল হিসাবে প্রথমে ইউআইকোলিকেশনভিউডেলিগেটফ্লোএলআউট যুক্ত করুন ।

তারপরে:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
        var columnCount = 3
        let width  = (view.frame.width - 20) / columnCount
        return CGSize(width: width, height: width)
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.