ইউআইকোলিকেশনভিউ ফাঁক ব্যবস্থার মার্জিন


181

আমার একটি আছে UICollectionViewযা ফটো দেখায়। আমি কালেকশন ভিউ ব্যবহার করে তৈরি করেছি UICollectionViewFlowLayout। এটি ভাল কাজ করে তবে আমি মার্জিনের ব্যবধান রাখতে চাই। এটি ব্যবহার করে কি সম্ভব UICollectionViewFlowLayoutবা আমার নিজের প্রয়োগ করা উচিত UICollectionViewLayout?

উত্তর:


331

আপনি collectionView:layout:insetForSectionAtIndex:আপনার জন্য পদ্ধতিটি ব্যবহার করতে পারেন UICollectionViewবা আপনার সাথে সংযুক্ত বস্তুর sectionInsetসম্পত্তি সেট করতে পারেন :UICollectionViewFlowLayoutUICollectionView

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    return UIEdgeInsetsMake(top, left, bottom, right);
}

অথবা

UICollectionViewFlowLayout *aFlowLayout = [[UICollectionViewFlowLayout alloc] init];
[aFlowLayout setSectionInset:UIEdgeInsetsMake(top, left, bottom, right)];

সুইফট 5-এর জন্য আপডেট হয়েছে

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

35
উল্লম্ব ফ্লো লেআউট ব্যবহার করার সময় আমি বাম এবং ডান কীটপতঙ্গগুলি কাজ করতে দেখছি না ...
জন

1
এখন বিভাগটি উপাহারকৃত উপক্লাসযুক্ত ইউআইকোলিকেশনভিউফ্লোএলআউটয়ের ইনসেট পদ্ধতিতেও কোনও প্রভাব নেই। নীচে বর্ণিত সম্পত্তি সেট করা কাজ করে।
ড্রেইন

4
এনবি: UICollectionViewDelegateFlowLayoutপদ্ধতিটি ব্যবহার করতে আপনার ভিউকন্ট্রোলার প্রতিনিধিদের তালিকায় যুক্ত মনে রাখবেনinsetForSectionAtIndex
ডেভিড ডগলাস

98

ইন্টারফেস বিল্ডারে ইনসেট সেটআপ করা হচ্ছে যেমন নীচের স্ক্রিনশটে প্রদর্শিত হয়েছে

ইউআইকোলিকেশনভিউয়ের জন্য বিভাগের ইনসেটগুলি সেট করা

এর মতো কিছু ঘটবে:

বিভাগ কীটপতঙ্গ সহ একটি সংগ্রহ দর্শন সেল


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

75

উপর ব্যবধান যোগ করার জন্য সমগ্র UICollectionView :

UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*) collection.collectionViewLayout;
flow.sectionInset = UIEdgeInsetsMake(topMargin, left, bottom, right);

একই সারির উপাদানগুলির মধ্যে ফাঁক দিয়ে খেলতে (আপনি যদি অনুভূমিকভাবে স্ক্রোল করছেন তবে কলাম) এবং তাদের আকারগুলি:

flow.itemSize = ...;
flow.minimumInteritemSpacing = ...;

5
এটি কাজ করে, তবে collection.collectionViewLayoutপ্রয়োজনে উদাহরণ হিসাবে যেমন একটি কাস্ট প্রয়োজন @ পূজা লিখেছেন: UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*) self.collectionViewLayout;
jwj

দ্রুত কাস্টিংif let flow = collectionViewLayout as? UICollectionViewFlowLayout { flow.itemSize = CGSize(width: 100, height: 100) }
এমিলি

41

সুইফট 4

    let flow = collectionView.collectionViewLayout as! UICollectionViewFlowLayout // If you create collectionView programmatically then just create this flow by UICollectionViewFlowLayout() and init a collectionView by this flow.

    let itemSpacing: CGFloat = 3
    let itemsInOneLine: CGFloat = 3
    flow.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    let width = UIScreen.main.bounds.size.width - itemSpacing * CGFloat(itemsInOneLine - 1) //collectionView.frame.width is the same as  UIScreen.main.bounds.size.width here.
    flow.itemSize = CGSize(width: floor(width/itemsInOneLine), height: width/itemsInOneLine)
    flow.minimumInteritemSpacing = 3
    flow.minimumLineSpacing = 3

সম্পাদনা করুন এক্সকোড 11.4 এবং সুইফ্ট 5

let flow = collectionView.collectionViewLayout as! UICollectionViewFlowLayout

কাজ করে না নীচে কাজ ব্যবহার করুন।

let flow = UICollectionViewFlowLayout()

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


ব্যবধানে রঙ সেট করার কোনও উপায় আছে কি?
মার্টন ড্যানিয়েল

1
@ মার্টনডানিয়েল কেবলমাত্র এর মধ্যে সেট backgroundColorকরুন collectionView। বা যাই হোক না কেন সুপার ভিউ।
উইলিয়াম হু

1
তবে প্রান্তগুলিতে কোনও মার্জিন নেই
user924

@ ব্যবহারকারী924 প্রান্তগুলিতে মার্জিনগুলি ইউআইইডিজিনসেটস (শীর্ষ: বাম: নীচে: ডান:) দিয়ে সেট করা যেতে পারে। যদি উল্লম্বভাবে স্ক্রোলিং হয় তবে বাম / ডান ইনসেটগুলি সেট করুন। যদি অনুভূমিকভাবে স্ক্রোলিং হয় তবে উপরের এবং নীচের ইনসেটগুলি সেট করুন।
মারসি

40

এই পৃষ্ঠায় কিছু ভুল তথ্য সংশোধন করতে:

1- সর্বনিম্ন আন্তঃআরমি স্পেসিং : একই সারিতে থাকা আইটেমগুলির মধ্যে ব্যবহারের জন্য সর্বনিম্ন ব্যবধান।

ডিফল্ট মান: 10.0।

(উল্লম্বভাবে স্ক্রোলিং গ্রিডের জন্য, এই মানটি একই সারিতে থাকা আইটেমগুলির মধ্যে ন্যূনতম ব্যবধানকে উপস্থাপন করে))

2- সর্বনিম্ন লাইনেস্পেসিং : গ্রিডে আইটেমগুলির লাইনের মধ্যে ব্যবহারের জন্য সর্বনিম্ন ব্যবধান।

রেফারেন্স: http://developer.apple.com/library/ios/#docamentation/uikit/references/UICollectionViewFlowLayout_class/References/References.html


2
এটি কেবল একই বিভাগের আইটেমগুলির মধ্যে বিভাগগুলির মধ্যে ব্যবধানকে প্রভাবিত করবে বলে মনে হচ্ছে না?
ক্রশলোট

@ ক্র্যাশলোট - আপনি কি নিশ্চিত যে আপনি ন্যূনতমলাইনস্পেসিং মানে না? অর্থাৎ কোষের প্রতিটি লাইন? আপনি যদি প্রকৃতপক্ষে বিভাগগুলি ব্যবহার করেন তবে বিভাগ ইনসেটের জন্যও বিকল্প রয়েছে।
চকি

এটি আমার জন্য স্টোরিবোর্ড ইন্টারফেসের মাধ্যমে কাজ করেছে। আমি অনুভূমিক কেবল সংগ্রহের দর্শনগুলির সমাধান খুঁজছিলাম। ধন্যবাদ +10
কেমিকোফা ভূত

9

আধুনিক সুইফ্ট, স্বয়ংক্রিয় বিন্যাস গণনা

যদিও এই থ্রেডটিতে ইতিমধ্যে বেশ কয়েকটি দরকারী উত্তর রয়েছে, তবে আমি উইলিয়াম হু এর উত্তরের ভিত্তিতে একটি আধুনিক সুইফ্ট সংস্করণ যুক্ত করতে চাই । এটি দুটি জিনিসকেও উন্নত করে:

  • বিভিন্ন লাইনের মধ্যে ব্যবধান এখন সবসময় একই লাইনের আইটেমগুলির মধ্যে ব্যবধানের সাথে মেলে।
  • সর্বনিম্ন প্রস্থ নির্ধারণ করে, কোডটি স্বয়ংক্রিয়ভাবে একটি সারিতে আইটেমের সংখ্যা গণনা করে এবং প্রবাহ বিন্যাসে that স্টাইলটি প্রয়োগ করে।

কোডটি এখানে:

// Create flow layout
let flow = UICollectionViewFlowLayout()

// Define layout constants
let itemSpacing: CGFloat = 1
let minimumCellWidth: CGFloat = 120
let collectionViewWidth = collectionView!.bounds.size.width

// Calculate other required constants
let itemsInOneLine = CGFloat(Int((collectionViewWidth - CGFloat(Int(collectionViewWidth / minimumCellWidth) - 1) * itemSpacing) / minimumCellWidth))
let width = collectionViewWidth - itemSpacing * (itemsInOneLine - 1)
let cellWidth = floor(width / itemsInOneLine)
let realItemSpacing = itemSpacing + (width / itemsInOneLine - cellWidth) * itemsInOneLine / max(1, itemsInOneLine - 1))

// Apply values
flow.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
flow.itemSize = CGSize(width: cellWidth, height: cellWidth)
flow.minimumInteritemSpacing = realItemSpacing
flow.minimumLineSpacing = realItemSpacing

// Apply flow layout
collectionView?.setCollectionViewLayout(flow, animated: false)

যদি itemsInOneLine1 হয় তবে এখানে শূন্য দ্বারা বিভাজনের কারণে এটি একটি NaN এর ফলাফল করবে:itemsInOneLine / (itemsInOneLine - 1)
টাইলারজেমস

1
টুইটারজেমস ধন্যবাদ! আমি সমস্যাটি ঠিক করার জন্য কোডটি সামঞ্জস্য করেছি;)
ফ্রেডপি

8

ব্যবহার setMinimumLineSpacing:এবং setMinimumInteritemSpacing:উপর UICollectionViewFlowLayout-Object।


না এটি কাজ করে না, যেমনটি প্রত্যাশিত। সেটমিনিমামলাইনস্পেসিংটি: একই সারির আইটেমগুলির মধ্যে ব্যবহারের জন্য সর্বনিম্ন ব্যবধান। এবং সেটমিনিমিমিটারটাইমস্পেসিং হ'ল: গ্রিডে আইটেমগুলির লাইনগুলির মধ্যে ব্যবহারের জন্য সর্বনিম্ন ব্যবধান। আমার প্রশ্ন উপাদানগুলির মধ্যে স্থান নয় মার্জিন সম্পর্কে। যেমন। প্রথম উপাদানটির বাম এবং শীর্ষ ব্যবধান।
Mert

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

8

ব্যবহার collectionViewFlowLayout.sectionInsetবা collectionView:layout:insetForSectionAtIndex:সঠিক।

তবে আপনার সংগ্রহেভিউয়ের যদি একাধিক বিভাগ থাকে এবং আপনি পুরো সংগ্রহভিউতে মার্জিন যুক্ত করতে চান তবে আমি স্ক্রোলভিউ সামগ্রীটি ব্যবহার করার পরামর্শ দিচ্ছি ইনসেট:

UIEdgeInsets collectionViewInsets = UIEdgeInsetsMake(50.0, 0.0, 30.0, 0.0);
self.collectionView.contentInset = collectionViewInsets;
self.collectionView.scrollIndicatorInsets = UIEdgeInsetsMake(collectionViewInsets.top, 0, collectionViewInsets.bottom, 0);

5

CollectionItemএর মধ্যে স্থান রাখার জন্য এটি ব্যবহার করুন

এই দুটি লাইন ভিউডিডলোডে লিখুন

UICollectionViewFlowLayout *collectionViewLayout = (UICollectionViewFlowLayout*)self.collectionView.collectionViewLayout;
collectionViewLayout.sectionInset = UIEdgeInsetsMake(<CGFloat top>, <CGFloat left>, <CGFloat bottom>, <CGFloat right>)

5

আপনার সাথে সংযুক্ত বস্তুর insetForSectionAtসম্পত্তি সেট UICollectionViewFlowLayoutকরুনUICollectionView

এই প্রোটোকলটি যুক্ত করার বিষয়টি নিশ্চিত করুন

UICollectionViewDelegateFlowLayout

দ্রুতগতি

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

উদ্দেশ্য গ

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    return UIEdgeInsetsMake(top, left, bottom, right);
}

2

অবজেক্টিভ-সি তে

CGFloat spacing = 5;
UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*)_habbitCollectionV.collectionViewLayout;
flow.sectionInset = UIEdgeInsetsMake(0, spacing, 0, spacing);
CGFloat itemsPerRow = 2;
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat oneMore = itemsPerRow + 1;
CGFloat width = screenRect.size.width - spacing * oneMore;
CGFloat height = width / itemsPerRow;

flow.itemSize = CGSizeMake(floor(height), height);
flow.minimumInteritemSpacing = spacing;
flow.minimumLineSpacing = spacing;

আপনাকে যা করতে হবে তা হ'ল আইটেমস পেয়ার মান পরিবর্তন করতে হবে এবং এটি অনুসারে প্রতি সারিতে আইটেমের সংখ্যা আপডেট করবে। তদতিরিক্ত, যদি আপনি কম-বেশি সাধারণ ব্যবধান চান তবে আপনি ব্যবধানের মানটি পরিবর্তন করতে পারেন।

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


1
চমৎকার ... এটি ওয়ার্ক পারফেক্ট।
সোহিল

1

নির্দিষ্ট কক্ষগুলিতে মার্জিন যুক্ত করার জন্য, আপনি এই কাস্টম প্রবাহ বিন্যাসটি ব্যবহার করতে পারেন। https://github.com/voyages-sncf-technologies/VSCollectionViewCellInsetFlowLayout/

extension ViewController : VSCollectionViewDelegateCellInsetFlowLayout 
{
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForItemAt indexPath: IndexPath) -> UIEdgeInsets {
        if indexPath.item == 0 {
            return UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)
        }
        return UIEdgeInsets.zero
    }
}

0

সুইফ্ট 4 এবং অটোলাউটে আপনি বিভাগটি ইনসেটটি ব্যবহার করতে পারেন :

let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .vertical
        layout.itemSize = CGSize(width: (view.frame.width-40)/2, height: (view.frame.width40)/2) // item size
        layout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10) // here you can add space to 4 side of item
        collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: layout) // set layout to item
        collectionView?.register(ProductCategoryCell.self, forCellWithReuseIdentifier: cellIdentifier) // registerCell
        collectionView?.backgroundColor = .white // background color of UICollectionView
        view.addSubview(collectionView!) // add UICollectionView to view

-1

প্রতিটি বিভাগের মধ্যে 10px বিভাজন যুক্ত করতে কেবল এটি লিখুন

flowLayout.sectionInset = UIEdgeInsetsMake(0.0, 0.0,10,0);

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

-1
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {       
         return UIEdgeInsetsMake(7, 10, 5, 10);    
   }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.