क्षैतिज रूप से UICollectionView Cells को केंद्र में कैसे रखें?


123

मैंने कुछ शोध किए हैं, लेकिन मैं क्षैतिज रूप से UICollectionView में कोशिकाओं को कैसे केंद्र में कर सकता हूं, इस पर कोई कोड उदाहरण नहीं मिला।

इस X00 की तरह पहली सेल होने के बजाय , मैं चाहता हूं कि यह 0X0 जैसा हो । क्या इसे पूरा करने का कोई रास्ता है?

संपादित करें:

कल्पना करना कि मैं क्या चाहता हूँ:

यहाँ छवि विवरण दर्ज करें

मुझे संस्करण B की तरह दिखने की आवश्यकता है जब CollectionView में केवल एक तत्व है। जब मुझे एक से अधिक तत्व मिले, तो यह संस्करण ए की तरह होना चाहिए लेकिन अधिक तत्वों के साथ।

फिलहाल यह संस्करण ए की तरह दिखता है जब मेरे पास केवल 1 तत्व है, और मुझे आश्चर्य है कि मैं इसे बी की तरह कैसे बना सकता हूं।

सहायता के लिए धन्यवाद!


क्या सेल को संग्रह दृश्य की चौड़ाई फिट करने देना आसान नहीं है और फिर संग्रह के दृश्य को अपने माता-पिता के भीतर केंद्रित करना है?
आर्थर गेवोरकन

हाँ, ऐसा करने का कम से कम दो तरीका है, पहला (तेज़) पूरे स्क्रीन की सेल चौड़ाई बनाना और उसके बच्चे के दृश्य को केंद्र बनाना। दूसरा (दाएं) कस्टम कलेक्शन व्यू लेआउट लागू करें
sage444

अंत में बैकएंड से आने वाली अधिक कोशिकाएं होंगी, पूरी चौड़ाई भरना अच्छा विचार नहीं होगा
RaptoX

चौड़ाई बढ़ाने के लिए केंद्र में स्थापित करने के लिए पर्याप्त है
किशोर कुमार

जवाबों:


227

एक पुस्तकालय का उपयोग करने के लिए यह एक अच्छा विचार नहीं है, अगर आपका उद्देश्य केवल यही है अर्थात केंद्र संरेखित करें।

बेहतर है कि आप इस सरल गणना को अपने कलेक्शन व्यूलेआउट फ़ंक्शन में कर सकते हैं।

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {

    let totalCellWidth = CellWidth * CellCount
    let totalSpacingWidth = CellSpacing * (CellCount - 1)

    let leftInset = (collectionViewWidth - CGFloat(totalCellWidth + totalSpacingWidth)) / 2
    let rightInset = leftInset

    return UIEdgeInsets(top: 0, left: leftInset, bottom: 0, right: rightInset)
}

2
@ DarshanPatel.Thanks ने बहुत से उत्तर दिए जिन पर मैंने इसे लागू किया और पंक्तियाँ केंद्र में आईं, लेकिन अब समस्या यह है कि मैं पहले आइटम को स्क्रॉल नहीं कर सकता। जब मैं पहले आइटम पर स्क्रॉल करने की कोशिश करता हूं तो यह मुझे संशोधित UIEdgeInsets पर वापस लाता है। आप मेरा डेमो ऐप github.com/anirudha-music/CollectionViewCenter
अनिरुद्ध महाले

5
स्विफ्ट 3 में, नई विधि हस्ताक्षर है collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int)
कामचटका

1
आप सेलविड को कैसे पकड़ सकते हैं, क्या यह सेल cellororememAt के माध्यम से संभव है? मैंने कोशिश की और यह nil लौट आया .. मेरे लिए सेल की चौड़ाई स्क्रीन आकार के आधार पर परिवर्तन .. @DarshanPatel।
क्रिस

10
@DarshanPatel। आपका उत्तर कभी-कभी छोटे उपकरणों पर नकारात्मक मान उत्पन्न कर सकता है। अपने leftInsetमूल्य पर अधिकतम जाँच का उपयोग करने पर विचार करें जैसे:let leftInset = max(0.0, (self.collectionView.bounds.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2)
रियुरी ग्लेन

3
यदि आप UICollectionViewController को उप-वर्ग नहीं कर रहे हैं, तो सुनिश्चित करें कि आपकी कक्षा UICollectionViewDelegateFlowLayout के अनुरूप है अन्यथा यह काम नहीं करेगा
सईद

59

स्विफ्ट 5.1

func centerItemsInCollectionView(cellWidth: Double, numberOfItems: Double, spaceBetweenCell: Double, collectionView: UICollectionView) -> UIEdgeInsets {
    let totalWidth = cellWidth * numberOfItems
    let totalSpacingWidth = spaceBetweenCell * (numberOfItems - 1)
    let leftInset = (collectionView.frame.width - CGFloat(totalWidth + totalSpacingWidth)) / 2
    let rightInset = leftInset
    return UIEdgeInsets(top: 0, left: leftInset, bottom: 0, right: rightInset)
}

स्विफ्ट 4.2

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

    let totalCellWidth = 80 * collectionView.numberOfItems(inSection: 0)
    let totalSpacingWidth = 10 * (collectionView.numberOfItems(inSection: 0) - 1)

    let leftInset = (collectionView.layer.frame.size.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2
    let rightInset = leftInset

    return UIEdgeInsets(top: 0, left: leftInset, bottom: 0, right: rightInset)

}

स्विफ्ट 3

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets {

        let totalCellWidth = 80 * collectionView.numberOfItems(inSection: 0)
        let totalSpacingWidth = 10 * (collectionView.numberOfItems(inSection: 0) - 1)

        let leftInset = (collectionView.layer.frame.size.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2
        let rightInset = leftInset

        return UIEdgeInsetsMake(0, leftInset, 0, rightInset)

    }

प्रोटोकॉल जोड़ने के लिए मत भूलना

UICollectionViewDelegateFlowLayout

अड़चन हो सकती है @ashForIos
अहमद

जब कोशिका गणना केंद्र में होती है तो कोशिकाएं केंद्र में होती हैं और आप पहली कोशिकाओं या अंतिम तक स्क्रॉल नहीं कर सकते, तो आपका उत्तर ठीक काम करता है।
निकोडर

2
@Vitalii 80 माध्य सेल चौड़ाई, और 10 कोशिकाओं के बीच की जगह, यदि आप चर नाम को पढ़ेंगे तो आप समझेंगे कि इसका क्या मतलब है: P
अहमद सफ़दी

स्विफ्ट 4.2 समाधान आसान है, धन्यवाद! आपकी वास्तविक सेल-ऑब्जेक्ट चौड़ाई जो भी हो, बस "80" सेट करना सुनिश्चित करें।
जॉन पिट्स

25

स्विफ्ट 4 के लिए यह प्रयास करें

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        let cellWidth : CGFloat = 165.0

        let numberOfCells = floor(self.view.frame.size.width / cellWidth)
        let edgeInsets = (self.view.frame.size.width - (numberOfCells * cellWidth)) / (numberOfCells + 1)

        return UIEdgeInsetsMake(15, edgeInsets, 0, edgeInsets)
    }

165.0 के बजाय अपना सेलविड जोड़ें


1
यह सबसे अच्छा जवाब है। इसमें सबसे सरल गणित के साथ। पंक्तियों और स्तंभों की किसी भी संख्या के साथ काम करता है
rickrvo

20

मैं उपयोग करता हूं KTCenterFlowLayout का हूं , और यह बहुत अच्छा काम करता है। UICollectionViewFlowLayoutजैसा कि आप चाहते हैं , यह उस केंद्र की कोशिकाओं का एक कस्टम उपवर्ग है । (नोट: यह कुछ कोड पोस्ट करके हल करने के लिए एक तुच्छ बात नहीं है, यही वजह है कि मैं एक GitHub परियोजना से जुड़ रहा हूं!)


यह आईबी से काम नहीं कर सका। इस लाइब्रेरी ने मेरे लिए एक आकर्षण की तरह काम किया। बस पॉड स्थापित किया और आईबी में लेआउट का वर्ग बदल दिया!
टैगिरकाज

15

दर्शन पटेल के जवाब का एक उद्देश्य-सी संस्करण :

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(nonnull UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    CGFloat totalCellWidth = kItemWidth * self.dataArray.count;
    CGFloat totalSpacingWidth = kSpacing * (((float)self.dataArray.count - 1) < 0 ? 0 :self.dataArray.count - 1);
    CGFloat leftInset = (self.bounds.size.width - (totalCellWidth + totalSpacingWidth)) / 2;
    CGFloat rightInset = leftInset;
    UIEdgeInsets sectionInset = UIEdgeInsetsMake(0, leftInset, 0, rightInset);
    return sectionInset;
}

धन्यवाद। एकल पंक्ति के साथ इसका काम ठीक है। लेकिन कई पंक्ति में समस्या पैदा कर रहा है। मैं यहाँ यू स्क्रीन शॉट दिखाने के लिए यूआरएल जोड़ने में सक्षम नहीं हूँ। । लेकिन आप छोटे url में "yynoalzg" जोड़ सकते हैं। आपको आइडिया मिल जाएगा गोल्ड सेक्शन में 4 रिकॉर्ड हैं। 4 नई लाइन में होना चाहिए। .लेकिन इस विधि के बाद यह इस तरह प्रदर्शित होता है ... मुझे पता है अगर कोई विचार।
हितार्थ

6

@ सफ़द फ़नी के जवाब को थोड़ा संशोधित करते हुए, स्विफ्ट और आईओएस के सबसे लंबे संस्करण में मेरे लिए यही काम किया गया। इस मामले में मैं चाहता था कि कोशिकाओं की चौड़ाई संग्रह दृश्य के आकार का एक तिहाई हो।

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

  let totalCellWidth = Int(collectionView.layer.frame.size.width) / 3 * collectionView.numberOfItems(inSection: 0)
  let totalSpacingWidth = (collectionView.numberOfItems(inSection: 0) - 1)

  let leftInset = (collectionView.layer.frame.size.width - CGFloat(totalCellWidth + totalSpacingWidth)) / 2
  let rightInset = leftInset

  return UIEdgeInsetsMake(0, leftInset, 0, rightInset)
}

2
यह मेरे लिए विशेष रूप से काम करता है, जब केवल एक सेल होता है।
दासोगा

6

आप इस एक्सटेंशन (स्विफ्ट 4) का उपयोग कर सकते हैं।

यदि आपके collectionViewपास है तो यह कोशिकाओं को केंद्र में रख सकता हैlayout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize

यह किसी भी कोशिका के आकार के साथ काम करता है और जब पूरी तरह से काम करता है scrollDirection = .horizontal

public extension UICollectionView {
    func centerContentHorizontalyByInsetIfNeeded(minimumInset: UIEdgeInsets) {
        guard let layout = collectionViewLayout as? UICollectionViewFlowLayout,
            layout.scrollDirection == .horizontal else {
                assertionFailure("\(#function): layout.scrollDirection != .horizontal")
                return
        }

        if layout.collectionViewContentSize.width > frame.size.width {
            contentInset = minimumInset
        } else {
            contentInset = UIEdgeInsets(top: minimumInset.top,
                                        left: (frame.size.width - layout.collectionViewContentSize.width) / 2,
                                        bottom: minimumInset.bottom,
                                        right: 0)
        }
    }
}


final class Foo: UIViewController {
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        collectionView.centerContentHorizontalyByInsetIfNeeded(minimumInset: yourDefaultInset)
    }
}

आशा है कि यह आपकी मदद करेगा!


1
त्रुटि प्राप्त करना: थ्रेड 1: EXC_BAD_ACCESS (कोड = 2, पता = 0x118ffde58)
atulkhatri

4

स्विफ्ट 4.2 (क्षैतिज और ऊर्ध्वाधर)। यह पिंक पैंथर कोड का छोटा उन्नयन है और बड़ा धन्यवाद!


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
    let cellWidth: CGFloat = flowLayout.itemSize.width
    let cellHieght: CGFloat = flowLayout.itemSize.height
    let cellSpacing: CGFloat = flowLayout.minimumInteritemSpacing
    let cellCount = CGFloat(collectionView.numberOfItems(inSection: section))
    var collectionWidth = collectionView.frame.size.width
    var collectionHeight = collectionView.frame.size.height
    if #available(iOS 11.0, *) {
        collectionWidth -= collectionView.safeAreaInsets.left + collectionView.safeAreaInsets.right
        collectionHeight -= collectionView.safeAreaInsets.top + collectionView.safeAreaInsets.bottom
    }
    let totalWidth = cellWidth * cellCount + cellSpacing * (cellCount - 1)
    let totalHieght = cellHieght * cellCount + cellSpacing * (cellCount - 1)
    if totalWidth <= collectionWidth {
        let edgeInsetWidth = (collectionWidth - totalWidth) / 2

        print(edgeInsetWidth, edgeInsetWidth)
        return UIEdgeInsets(top: 5, left: edgeInsetWidth, bottom: flowLayout.sectionInset.top, right: edgeInsetWidth)
    } else {
        let edgeInsetHieght = (collectionHeight - totalHieght) / 2
        print(edgeInsetHieght, edgeInsetHieght)
        return UIEdgeInsets(top: edgeInsetHieght, left: flowLayout.sectionInset.top, bottom: edgeInsetHieght, right: flowLayout.sectionInset.top)

    }
}

सुनिश्चित करें कि आपकी कक्षा UICollectionViewDelegateFlowLayout प्रोटोकॉल के अनुरूप है


वास्तव में आपका कोड मेरे लिए बहुत अच्छा काम करता है, धन्यवाद दोस्त; )
स्टीवेर्सवा

4

यहाँ स्विफ्ट 5 के लिए नया संस्करण है, जो तब भी ठीक काम करता है जब कोशिकाएँ एक से अधिक होती हैं:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
    let cellWidth: CGFloat = flowLayout.itemSize.width
    let cellSpacing: CGFloat = flowLayout.minimumInteritemSpacing
    var cellCount = CGFloat(collectionView.numberOfItems(inSection: section))
    var collectionWidth = collectionView.frame.size.width
    var totalWidth: CGFloat
    if #available(iOS 11.0, *) {
        collectionWidth -= collectionView.safeAreaInsets.left + collectionView.safeAreaInsets.right
    }
    repeat {
        totalWidth = cellWidth * cellCount + cellSpacing * (cellCount - 1)
        cellCount -= 1
    } while totalWidth >= collectionWidth

    if (totalWidth > 0) {
        let edgeInset = (collectionWidth - totalWidth) / 2
        return UIEdgeInsets.init(top: flowLayout.sectionInset.top, left: edgeInset, bottom: flowLayout.sectionInset.bottom, right: edgeInset)
    } else {
        return flowLayout.sectionInset
    }
}

कृपया सुनिश्चित करें कि आपकी कक्षा प्रोटोकॉल के अनुरूप है UICollectionViewDelegateFlowLayout


3

स्विफ्ट 4

extension ViewController: UICollectionViewDelegateFlowLayout {

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

        let cellWidth: CGFloat = 170.0 // Your cell width

        let numberOfCells = floor(view.frame.size.width / cellWidth)
        let edgeInsets = (view.frame.size.width - (numberOfCells * cellWidth)) / (numberOfCells + 1)

        return UIEdgeInsetsMake(0, edgeInsets, 0, edgeInsets)
    }

 }

2

उन लोगों के लिए जो केवल एक पैडिंग जोड़ना चाहते हैं ( ऊपर, बाएं, नीचे, दाएं ):

प्रोटोकॉल जोड़ें UICollectionViewDelegateFlowLayout

यह उदाहरण 40 के साथ बाएँ और दाएँ एक पैडिंग दिखाता है।

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

2

स्विफ्ट 4.2

private lazy var contentView: UICollectionView = {
        let layoutView: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
            layoutView.scrollDirection = .horizontal
            layoutView.minimumInteritemSpacing = 0
            layoutView.minimumLineSpacing = 5

        let collectionView: UICollectionView = UICollectionView(frame: .zero, collectionViewLayout: layoutView)
            collectionView.dataSource = self
            collectionView.delegate = self
            collectionView.showsHorizontalScrollIndicator = false
            collectionView.isPagingEnabled = true
            collectionView.registerCell(Cell.self)
            collectionView.backgroundColor = .clear
            collectionView.translatesAutoresizingMaskIntoConstraints = false
        return collectionView
    }()

//

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

        return CGSize(width: collectionView.frame.width*4/5, height: collectionView.frame.height)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        let cellWidth : CGFloat = collectionView.frame.width*4/5

        let numberOfCells = floor(collectionView.frame.width / cellWidth)
        let edgeInsets = (collectionView.frame.width - (numberOfCells * cellWidth)) / (numberOfCells + 1)

        return UIEdgeInsets(top: 0, left: edgeInsets, bottom: 0, right: edgeInsets)
    }
}

1

आप मेरे समाधान की कोशिश कर सकते हैं यह ठीक काम करता है,

func refreshCollectionView(_ count: Int) {
    let collectionViewHeight = collectionView.bounds.height
    let collectionViewWidth = collectionView.bounds.width
    let numberOfItemsThatCanInCollectionView = Int(collectionViewWidth / collectionViewHeight)
    if numberOfItemsThatCanInCollectionView > count {
        let totalCellWidth = collectionViewHeight * CGFloat(count)
        let totalSpacingWidth: CGFloat = CGFloat(count) * (CGFloat(count) - 1)
        // leftInset, rightInset are the global variables which I am passing to the below function
        leftInset = (collectionViewWidth - CGFloat(totalCellWidth + totalSpacingWidth)) / 2;
        rightInset = -leftInset
    } else {
        leftInset = 0.0
        rightInset = -collectionViewHeight
    }
    collectionView.reloadData()
}

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

1

स्वीकृत उत्तर सही उत्तर है, लेकिन यदि आपका 's' totalCellWidthसे कम है , लेकिन सिर्फ इस बात से बचने के लिए कि आप नीचे बता सकते हैं।CollectionViewwidth

if (leftInset > 0) {
     return UIEdgeInsetsMake(0, leftInset, 0, rightInset)
  } else {
     return UIEdgeInsetsMake(0, 10, 0, 10)
}

1

यह कोड बिना किसी संशोधन के स्विफ्ट 4.0 में भी क्षैतिज रूप से संग्रह दृश्य को केंद्र में रखना चाहिए :

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
    let cellWidth: CGFloat = flowLayout.itemSize.width
    let cellSpacing: CGFloat = flowLayout.minimumInteritemSpacing
    let cellCount = CGFloat(collectionView.numberOfItems(inSection: section))
    var collectionWidth = collectionView.frame.size.width
    if #available(iOS 11.0, *) {
        collectionWidth -= collectionView.safeAreaInsets.left + collectionView.safeAreaInsets.right
    }
    let totalWidth = cellWidth * cellCount + cellSpacing * (cellCount - 1)
    if totalWidth <= collectionWidth {
        let edgeInset = (collectionWidth - totalWidth) / 2
        return UIEdgeInsetsMake(flowLayout.sectionInset.top, edgeInset, flowLayout.sectionInset.bottom, edgeInset)
    } else {
        return flowLayout.sectionInset
    }
}

सुनिश्चित करें कि आपकी कक्षा UICollectionViewDelegateFlowLayoutप्रोटोकॉल के अनुरूप है


0

मैंने यहां पूरी तरह से अलग दृष्टिकोण अपना लिया, जो मुझे विश्वास है कि ध्यान देने योग्य है।

मैंने केंद्र में क्षैतिज रूप से संरेखित होने के लिए अपने संग्रह दृश्य पर एक बाधा निर्धारित की। फिर मैंने एक और बाधा निर्धारित की जो चौड़ाई को निर्दिष्ट करती है। मैंने अपने दृश्य के अंदर चौड़ाई की कमी के लिए एक आउटलेट बनाया है जो संग्रह दृश्य रखता है। फिर, जब मेरा डेटा स्रोत बदल जाता है और मैं संग्रह दृश्य को अपडेट कर रहा हूं, तो मैं कोशिकाओं की गिनती लेता हूं और चौड़ाई को रीसेट करने के लिए (बहुत समान) गणना करता हूं।

let newWidth = (items.count * cellWidth) + (items.count * cellSpacing)

फिर मैंने बाधा आउटलेट की स्थापना की .constant गणना परिणाम के लिए मूल्य और बाकी को ऑटोलैयट करता है।

यह `UICollectionViewDelegateFlowLayout के साथ संघर्ष कर सकता है, लेकिन यह मेरे लिए एक वाम-औचित्य संग्रह दृश्य बनाने के लिए पूरी तरह से काम करता है। एक प्रतिनिधि के बिना, यह केवल तब काम करता है जब कोशिकाओं ने दृश्य के बहुमत को भर दिया।


0

फ़्लॉलीआउट के लिए सामान्य समाधान जो पृष्ठों को केंद्र में रखता है यदि वे चौड़ाई से कम हैं और अधिक होने पर बचे हुए संरेखित करते हैं

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(nonnull UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    // Centering if there are fever pages
    CGSize itemSize = [(UICollectionViewFlowLayout *)collectionViewLayout itemSize];
    CGFloat spacing = [(UICollectionViewFlowLayout *)collectionViewLayout minimumLineSpacing];

    NSInteger count = [self collectionView:self numberOfItemsInSection:section];
    CGFloat totalCellWidth = itemSize.width * count;
    CGFloat totalSpacingWidth = spacing * ((count - 1) < 0 ? 0 : count - 1);
    CGFloat leftInset = (self.bounds.size.width - (totalCellWidth + totalSpacingWidth)) / 2;
    if (leftInset < 0) {
        UIEdgeInsets inset = [(UICollectionViewFlowLayout *)collectionViewLayout sectionInset];
        return inset;
    }
    CGFloat rightInset = leftInset;
    UIEdgeInsets sectionInset = UIEdgeInsetsMake(0, leftInset, 0, rightInset);
    return sectionInset;
}

स्विफ्ट संस्करण (ObjC से परिवर्तित)

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    // Centering if there are fever pages
    let itemSize: CGSize? = (collectionViewLayout as? UICollectionViewFlowLayout)?.itemSize
    let spacing: CGFloat? = (collectionViewLayout as? UICollectionViewFlowLayout)?.minimumLineSpacing

    let count: Int = self.collectionView(self, numberOfItemsInSection: section)
    let totalCellWidth = (itemSize?.width ?? 0.0) * CGFloat(count)
    let totalSpacingWidth = (spacing ?? 0.0) * CGFloat(((count - 1) < 0 ? 0 : count - 1))
    let leftInset: CGFloat = (bounds.size.width - (totalCellWidth + totalSpacingWidth)) / 2
    if leftInset < 0 {
        let inset: UIEdgeInsets? = (collectionViewLayout as? UICollectionViewFlowLayout)?.sectionInset
        return inset!
    }
    let rightInset: CGFloat = leftInset
    let sectionInset = UIEdgeInsets(top: 0, left: Float(leftInset), bottom: 0, right: Float(rightInset))
    return sectionInset
}

शीर्षकहीन 3.png


स्विफ्ट कोड में सीमा क्या है? मैं अनसुलझे पहचानकर्ता 'सीमा' त्रुटि का उपयोग कर रहा हूँ
सचिन तानपुरे

नमस्ते, मेरे उदाहरण में, मैंने एक UIView के अंदर विधि लागू की, जिसमें सीमाएं हैं, यदि आप इसे कहीं और लागू कर रहे हैं, तो उपयुक्त सीमा का उपयोग करें
पीटर लापीसु जुएल

0

मेरे पास प्रोजेक्ट में समान स्थिति है, और मैंने इसे संदर्भित करके तय किया UPCarouselFlowLayout

मुझे लगता है कि यह समर्थन swift 5संस्करण है

https://github.com/ink-spot/UPCarouselFlowLayout/blob/master/UPCarouselFlowLayout/UPCarouselFlowLayout.swift

में कोड कार्यान्वयन को देखो

override open func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint

0

सबसे सरल तरीका है कि स्टोरीबोर्ड में या कोड के साथ संग्रह दृश्य अनुमान आकार सेट करना है layout.estimatedItemSize = CGSize.zero


0

यदि प्रति समूह एक सेल के लिए केवल एक कमरा है, leading:और एक सेल क्षैतिज रूप से केंद्र trailing:में .flexible(0)होगा:

item.edgeSpacing = NSCollectionLayoutEdgeSpacing(
    leading: .flexible(0), top: nil,                                                     
    trailing: .flexible(0), bottom: nil
)

0

मैंने एक प्रोजेक्ट में उस कोड का इस्तेमाल किया था। यह संग्रह दृश्य को क्षैतिज और लंबवत दोनों दिशाओं में .horizontalऔर .verticalअनुभागों के इनसेट का उपयोग करके केंद्र बनाता है। यदि सेट किया जाता है तो रिक्ति के अंतर और मूल इनसेट का सम्मान करता है। प्रतिनिधि में उपयोग करने के लिए कोड UICollectionViewDelegateFlowLayoutइसलिए हमारे पास UIcollectionViewपुन: प्रयोज्यता के लिए स्टोरीबोर्ड में सेट या सेट करने के लिए आवश्यक सभी गुणों तक पहुंच है ।

// original function of the delegate
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    // casting the layout as a UICollectionViewFlowLayout to have access to the properties of items for reusability - you could also link the real one from the storyboard with an outlet
    let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
    // getting all the properties we need
    let itemWidth = flowLayout.itemSize.width
    let itemHeight = flowLayout.itemSize.height
    let interSpacing = flowLayout.minimumInteritemSpacing
    let lineSpacing = flowLayout.minimumLineSpacing
    // getting the size of the collectionView
    let collectionWidth = collectionView.bounds.width
    let collectionHeight = collectionView.bounds.height
    // getting the direction to choose how to align the collection
    let direction = flowLayout.scrollDirection
    // you don't want to have an item greater than the collection
    guard (itemWidth < collectionWidth && direction == .vertical) || (itemHeight < collectionHeight && direction == .horizontal) else {
        print("Really?")
        return UIEdgeInsets(top: flowLayout.sectionInset.top, left: flowLayout.sectionInset.left, bottom: flowLayout.sectionInset.bottom, right: flowLayout.sectionInset.right)
    }
    // getting the number of item in the current section
    let totalItemCount = CGFloat(collectionView.numberOfItems(inSection: section))
    // setting number of item in a row to the max number of items that can fit in a row without spacing or to the number of items in the section if less than the max
    var itemCountInRow = totalItemCount < (collectionWidth / itemWidth).rounded(.towardZero) ? totalItemCount : (collectionWidth / itemWidth).rounded(.towardZero)
    // how many max row can we have
    var countOfRow = totalItemCount < (collectionHeight / itemHeight).rounded(.towardZero) ? totalItemCount : (collectionHeight / itemHeight).rounded(.towardZero)
    // calculating the total width of row by multiplying the number of items in the row by the width of item and adding the spacing multiplied by the number of item minus one
    var totalWidthOfRow:CGFloat {
        get{
            return (itemWidth * itemCountInRow) + (interSpacing * (itemCountInRow - 1))
        }
    }
    // calculating the total height of row by multiplying the number of row by the height of item and adding the spacing multiplied by the number of row minus one
    var totalHeightOfRow:CGFloat {
        get{
            return (itemHeight * countOfRow) + (lineSpacing * (countOfRow - 1))
        }
    }
    // first we set the inset to the default
    var edgeInsetLeft = flowLayout.sectionInset.left
    var edgeInsetTop = flowLayout.sectionInset.top

    if direction == .vertical {
        // while the width of row with original margin is greater than the width of the collection we drop one item until it fits
        while totalWidthOfRow > collectionWidth || ((collectionWidth - totalWidthOfRow) / 2) < flowLayout.sectionInset.left {
            // droping an item to fit in the row
            itemCountInRow -= 1
        }
        // calculating the number of rows in collectionView by dividing the number of items by the number of items in a row
        countOfRow = (totalItemCount / (itemCountInRow)).rounded(.up)
    } else {
        itemCountInRow = (totalItemCount / countOfRow).rounded(.up)
        // while the height of row with original marginis greater than the height of the collection we drop one row until it fits
        while totalHeightOfRow >= collectionHeight  || ((collectionHeight - totalHeightOfRow) / 2) < flowLayout.sectionInset.top  {
            // droping an item to fit in the row
            countOfRow -= 1
        }
    }
    edgeInsetLeft = max(flowLayout.sectionInset.left, (collectionWidth - totalWidthOfRow) / 2)
    edgeInsetTop = max(flowLayout.sectionInset.top, (collectionHeight - totalHeightOfRow) / 2)
    // we don't specially need insets where the items are overflowing
    let edgeInsetRight = direction == .vertical ? edgeInsetLeft : flowLayout.sectionInset.right
    let edgeInsetBottom = direction == .horizontal ? edgeInsetTop : flowLayout.sectionInset.bottom
    // returning the UIEdgeInsets
    return UIEdgeInsets(top: edgeInsetTop, left: edgeInsetLeft, bottom: edgeInsetBottom, right: edgeInsetRight)
}

आशा है कि यह किसी की मदद करेगा - यह अनुभाग को खंड के अंदर नहीं आइटम को केंद्र में रखता है, अधिक के लिए हमें Apple से उप मोज़ेक UICollectionViewFlowLayoutया UICollectionViewLayoutउदाहरण के रूप में उप-वर्ग करना होगा ।


-3

मुझे लगता है कि आपको सेल को केंद्र में रखने की आवश्यकता है, इसलिए इसके बजाय संग्रह दृश्य का उपयोग करें Ild जैसे UITableView का बहुत उपयोग होगा। बस एक UIViewController का उपयोग करें और सामने और पीछे दो UIViews रखें और UITableViewबीच में एक जगह रखें आशा है कि यह मदद करता है


मैंने आपको एक चित्र जोड़ा, यह दिखाने के लिए कि मुझे वास्तव में क्या चाहिए, धन्यवाद!
राप्टोक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.