কালেকশনভিউ আকারের আইটেমএটিএন্ডেক্সপথ কখনও কল করেনি


96

এটি আমাকে উন্মাদ করে দিচ্ছে! নীচের মত আমার কাছে একটি ইউআইসিএল্লেশনভিউকন্ট্রোলার রয়েছে:

class PhrasesCompactCollectionViewController: UICollectionViewController

নাম্বার অফসেকশন এবং সেলফোরআইটেমটি কল করা হচ্ছে তবে আকারের আইটেমএটিআইডেক্সপথটি কখনও কল করা হয় না। আমি অন্য কোথাও একই সঠিক কোডটি ব্যবহার করছি এবং এটি সঠিকভাবে ফায়ার করে। আমি এক্সকোড 8 বিটা 6 ব্যবহার করছি।

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

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

উত্তর:


255

আপনি নির্দিষ্ট করতে হবে যে আপনি UICollectionViewDelegateFlowLayoutনিজের শ্রেণীর ঘোষণায় প্রোটোকলটি প্রয়োগ করেছেন ।

class PhrasesCompactCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout


11
আমি এটি করেছি কিন্তু এখনও বলা হয় না। :(
ভ্যান ডু ট্রান

58

ইন সুইফট 3+ এই পদ্ধতি ব্যবহার করুন:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width:(collectionView.frame.height-90)/2, height: 100)
}

আপনার ক্লাস উভয় প্রতিনিধি মেনে চলে তা নিশ্চিত করুন

  • ইউআইকোলিকেশনভিউডেলিগেট

  • ইউআইকোলিকেশনভিউডেলিগেটফ্লোএলআউট


4
UICollectionViewDelegateইউআইসিএল্লেশনভিউকন্ট্রোলার ইতিমধ্যে যা করেছে তা মেনে চলাই বাড়াবাড়ি।
ভ্যান ডু ট্রান

4
@ ভানডুট্রান এটি বিব্রতকর নয় যে এটি প্রয়োজনীয় কারণ ইউআইসিকলিকেশন ভিউ কনট্রোলার হওয়ার প্রয়োজন নেই ...
মাইকেল হডসন

আমি মনে করি আপনি বোঝাতে চেয়েছিলেন যে একটি অ সংগ্রহের ভিউ, ভিউকন্ট্রোলারই ইউআইকোলিকেশনভিউডেলিগেট হতে পারে।
স্কটিব্ল্যাডেস

4
ইউআইসিএলিকেশনভিউডেলিগেটফ্লোএলয়েট ইউআইসিএল্লেশনভিউডেলিগেটের উত্তরাধিকারী তাই কেবল ইউআইকোলিকেশনভিউডেলিগেটফ্লোএলয়েট বাস্তবায়ন করুন
এভিয়া

49

আমারও একই সমস্যা ছিল। আমাকে যে জিনিসটি সাহায্য করেছিল তা হ'ল সংগ্রহের আকারের পরিদর্শক 'কিছুই নয়' এর আওতায় সেল আকারের জন্য 'আনুমানিক আকার' তৈরি করা।

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


9
আপনি আমার দিনকে বাঁচিয়েছিলেন, আপনি একজন নায়ক
আসিফ আলী

4
ব্যবহার সম্পর্কে অন্য সমস্ত পোস্টে অন্য কোনও উত্তর এই sizeForItemAtউল্লেখ করতে ব্যর্থ। খুব দরকারী.
জে কাটিং 8

এটা পাগলামি!!!! আমি আইফোন 5 সিমুলেটারে 10.3.1 আইওএস সংস্করণ দিয়ে পরীক্ষা করেছি এবং পদ্ধতিটি কল হয়ে যায়। আইফোন 5 এস সিমুলেটারে 10.3.1 সংস্করণ পদ্ধতি সহ কল ​​হয় না !!! আমি প্রাক্কলিত আকারটি কোনওটিতেই পরিবর্তন করেছিলাম। এটি আইফোন 5 এস এ কল করা শুরু করে। ডব্লিউটি ডব্লিউটি ডাব্লুটি
হাসান

অনেক ধন্যবাদ! কাস্টম সহ আমার সংগ্রহের দৃশ্যটি sizeForItemAtXcode 11.4 অবধি কার্যকরভাবে কাজ করেছিল যখন হঠাৎ করে কোষগুলি ভুল প্রস্থে ছিল। গুচ্ছ জিনিস চেষ্টা করে এবং শেষ পর্যন্ত এটি কাজ করে।
ফিলিপ করুন

আপনি আমার সময় বাঁচিয়েছেন। অনেক ধন্যবাদ.
শাহবাজ আকরাম

17

সুইফট 5

এই সমস্ত পদক্ষেপ প্রয়োজনীয় :

  1. সাথে সামঞ্জস্য UICollectionViewDelegateFlowLayout <== একেবারে প্রয়োজন !!
  2. এবং UICollectionViewDelegate, UICollectionViewDataSource
  3. এগুলি ভিডিডলডে সেট করুন: collectionView.delegate = selfএবংcollectionView.dataSource = self
  4. সেট অনুমান কেউ সাইজ ইন্টারফেস বিল্ডার মধ্যে
  5. নিশ্চিত হয়ে নিন যে নীচের পদ্ধতিতে মাপের ফর্ম আইটেম্যাট রয়েছে এবং মাপেরফর্ম আইটেমটিডেক্সপথ নেই Make

যেমন:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
    return CGSize(width: 100, height:100)
} 

4
কোনওটির সাথে আকারের প্রাক্কলন করুন - আমার দিনটি বাঁচান!
জো হ্যালেনবেক

এই উত্তরটি গ্রহণ করুন এটি সঠিক!
নিককডার

15

সুইফট 3

ইউআইকোলিকেশনভিউর সেল আকার নির্ধারণ করতে, আপনাকে অবজেক্টটি তৈরি এবং কাস্টমাইজ করতে হবে UICollectionViewFlowLayout। বৈশিষ্ট্যগুলি কাস্টমাইজ করুন এবং সেই লেআউট অবজেক্টটি ইউআইসিএল্লেশনভিউ অবজেক্টে সেট করুন।

আপনার প্রয়োজনীয়তা অনুসারে সেলহাইট এবং সেল ঘর প্রস্থের অবজেক্টগুলি পরিবর্তন করুন (আপনি যে ঘরের উচ্চতা এবং প্রস্থ চান)।

override func viewDidLoad() {
    super.viewDidLoad()

    let cellWidth : CGFloat = myCollectionView.frame.size.width / 4.0
    let cellheight : CGFloat = myCollectionView.frame.size.height - 2.0
    let cellSize = CGSize(width: cellWidth , height:cellheight)

    let layout = UICollectionViewFlowLayout()
    layout.scrollDirection = .vertical //.horizontal
    layout.itemSize = cellSize
    layout.sectionInset = UIEdgeInsets(top: 1, left: 1, bottom: 1, right: 1)
    layout.minimumLineSpacing = 1.0
    layout.minimumInteritemSpacing = 1.0
    myCollectionView.setCollectionViewLayout(layout, animated: true)

    myCollectionView.reloadData()
}

নিশ্চিত করুন: আপনি যদি আকারের আইটেম্যাট সূচকপথ পদ্ধতি যুক্ত করেন তবে অবশ্যই পদ্ধতিটি সরিয়ে ফেলতে হবে ...

পদ্ধতির নীচে সরান

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

}

12
এটি কীভাবে সহায়ক?
আলমাস 18

4
আলমাস, এটি ইউআইসিএলিকেশনভিউসেলর কাস্টম সেল আকার নির্ধারণের জন্য সহায়ক হবে ... এখানে সেল-প্রস্থ এবং সেল হাইটের ভেরিয়েবল রয়েছে যা আপনি নিজের মানগুলি সংজ্ঞায়িত করতে পারেন ... পাশাপাশি "লেআউট.সেকশনইনেসেট", "লেআউট.মিনিমামলাইনস্পেসিং" এবং "লেআউট .minimumInteritemSpacing ", এই ভেরিয়েবলগুলি ইউআইসি কলিকেশনভিউসেল আকারের জন্যও গুরুত্বপূর্ণ ...
গৌরব রামি

4
এটি শুধুমাত্র তখনই কাজ করে যদি সমস্ত ঘর একই আকারের হয়। নীচের উত্তরটি সঠিক উত্তর
জেফএন

এটি ইউআইকোলিকেশনভিউয়ের আকার পরিবর্তনের জন্য তবে ভিউটির অভ্যন্তরের কক্ষের জন্য নয়
Async-

প্রতিনিধি পদ্ধতিটি কেন বলা হয় না এটির কোনও উত্তর নয়
জিভ কেস্টেন

6

প্রথম শ্রেণীর ইউআইকোলিকেশনভিউ ডেলিগেটফ্লোএলআউটের নিশ্চয়তা প্রয়োজন। তারপরে আপনাকে ভিডডিডলয়েড () এ নিম্নলিখিত কোডগুলি লিখতে হবে:

// আপনার ইউআইভিউউকন্ট্রোলারের ইউআইসি কালেকশনভিউডিজিলেটফ্লোএলআউট পদ্ধতিগুলি ব্যবহার করতে ইউআইকোলিকেশনভিউকে বলতে

collectionView.delegate = self

// আপনি নিজের সংগ্রহ ভিউ ফ্লো লেআউট সেট করতে চান

let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical //depending upon direction of collection view

self.collectionView?.setCollectionViewLayout(layout, animated: true)

এই কোডটি ইউআইকোলিকেশনভিউডেলিগেটফ্লোলআউট পদ্ধতিটি ব্যবহার করে

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

কল হবে, আপনি এই পদ্ধতিতে আকার সেট করতে পারেন।


4

কোনও উত্তর কার্যকর না হলে আপনার তিনটি জিনিস যাচাই করতে হবে:

  1. ফ্লো লেআউট ডেলিগেট প্রয়োগ করুন: class MyController: UICollectionViewController, UICollectionViewDelegateFlowLayout

  2. সুইট ৩.০+ এর জন্য আইটেমের আকারের জন্য পদ্ধতিটি ব্যবহার করুন: func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { return CGSize(width: (collectionView.frame.width / 3) - 1, height: collectionView.frame.width) }

  3. Estimate size = Noneইউআইকোলিকেশনভিউয়ের পরিদর্শন উপাদানটি নির্বাচন করুন ।


2

আমার একই সমস্যা ছিল এবং কিছুই এটিকে ঠিক করতে পারে না। এটিকে ব্যক্তিগত করার জন্য আমার একটি হলুদ সতর্কতা ছিল কারণ এটি লেআউট ডেলিগেট দ্বারা সংজ্ঞায়িত অন্য ফাংশনের কাছে এসেছিল। আমার জন্য যা স্থির হয়েছিল তা হ'ল:

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

"সাইজফর্ম আইটেমটাইডেক্সপথ" থেকে সঠিক "সাইজফোরআইটেম্যাট" এর মধ্যে পার্থক্যটি লক্ষ্য করুন।

আমি এটি বের করার চেষ্টা করে কয়েক দিন ধরে আমার চুল ছিড়ে ফেলেছিলাম এবং অবশেষে এটি কার্যকর হয়েছিল। নীচে আমি আমার সমস্ত ফাংশন অন্তর্ভুক্ত করব তা দেখানোর জন্য যে আমি কীভাবে উচ্চতা 0 এর সমান করে একটি ঘর "লুকিয়ে" রেখেছি।

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let findIndex = labelArray.index(of: "\(labelArray[indexPath.row])")
    let screenSize = UIScreen.main.bounds
    let screenWidth = screenSize.width

    if (findIndex! % 2 == 0){
        // Even index, show cell
        return CGSize(width: screenWidth, height: 246)
    }
    else {
        return CGSize(width: screenWidth, height: 0)
    }
}

1

নিশ্চিত হয়ে নিন যে আপনি এটি ভিডডিডোডে রেখেছেন ()

collectionView.delegate = self

0

আমি গত রাতে এই সমস্যা ছিল। অবশেষে মধ্যরাতে এটি সমাধান করেছি যখন আমি বুঝতে পেরেছিলাম যে 'didSelectItemAtIndex' পদ্ধতিটি বন্ধ বন্ধনী "}" দিয়ে বন্ধ করা হয়নি

সংকলনের ত্রুটি জিজ্ঞাসা করার সময় আমি ক্লাসের একেবারে নীচে ক্লোজার বন্ধনী যুক্ত করেছি। সুতরাং কার্যকরভাবে 'didSelectItemAtIndex' এর নীচের সমস্ত পদ্ধতি সেই পদ্ধতির ভিতরে ছিল।

অন্য কেউ যদি এই একটিতে তাদের 4 ঘন্টা সন্ধ্যা নষ্ট করে তবে এখানে পোস্ট করা :-(


0

আমার সমস্যাটি হ'ল আমার ইউআইকোলিকেশনভিউ ডেটা সোর্স অবজেক্টটি স্থানীয় ভেরিয়েবল হিসাবে তৈরি হয়েছিল। সুতরাং আপনি যদি কোডে নিজের ডেটাসোর্স অবজেক্টটিকে ম্যানুয়ালি আরম্ভ করেন তবে এটিকে বিশ্বব্যাপী পরিবর্তনশীল হিসাবে সংরক্ষণ করার বিষয়টি নিশ্চিত করুন।


0

এই পদ্ধতিটি ব্যবহার করুন

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

}

পরিবর্তে

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

}

0

কেবল যুক্ত করুন: ইউআইসি কলিকেশনভিউডেলিগেটফ্লোএলআউট

class YourClass: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {}

-12

আমার জন্য (সুইফ্ট ৩.১-এ) পদ্ধতিটি অবশ্যই এইভাবে সর্বজনীনভাবে ঘোষণা করতে হবে:

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

এটি তৈরি করতে করতে ভুলবেন না পাবলিক


publicফ্রেমওয়ার্ক এবং মডিউলগুলির মধ্যে আপনার কোডটিকে অ্যাক্সেসযোগ্য করার জন্য আপনি যা ব্যবহার করেন তা।
স্কটিব্ল্যাডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.