ฉันมีรูปUICollectionView
ที่แสดง ผมได้สร้าง collectionview UICollectionViewFlowLayout
โดยใช้ มันใช้งานได้ดี แต่ฉันต้องการเว้นระยะขอบ มันเป็นไปได้ที่จะทำใช้UICollectionViewFlowLayout
หรือฉันจะต้องดำเนินการของตัวเองUICollectionViewLayout
?
ฉันมีรูปUICollectionView
ที่แสดง ผมได้สร้าง collectionview UICollectionViewFlowLayout
โดยใช้ มันใช้งานได้ดี แต่ฉันต้องการเว้นระยะขอบ มันเป็นไปได้ที่จะทำใช้UICollectionViewFlowLayout
หรือฉันจะต้องดำเนินการของตัวเองUICollectionViewLayout
?
คำตอบ:
คุณสามารถใช้collectionView:layout:insetForSectionAtIndex:
วิธีการของคุณUICollectionView
หรือตั้งค่าsectionInset
คุณสมบัติของUICollectionViewFlowLayout
วัตถุที่แนบมากับของคุณUICollectionView
:
- (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)];
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets(top: 25, left: 15, bottom: 0, right: 5)
}
UICollectionViewDelegateFlowLayout
ในรายชื่อผู้รับมอบสิทธิ์ ViewController ของคุณเพื่อใช้วิธีการinsetForSectionAtIndex
การตั้งค่าสิ่งที่ใส่เข้าไปในตัวสร้างส่วนต่อประสานเช่นที่แสดงในภาพหน้าจอด้านล่าง
จะส่งผลดังนี้:
ในการเพิ่มระยะห่างในภาพรวม UICollectionView
:
UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*) collection.collectionViewLayout;
flow.sectionInset = UIEdgeInsetsMake(topMargin, left, bottom, right);
หากต้องการเล่นกับระยะห่างระหว่างองค์ประกอบของแถวเดียวกัน (คอลัมน์หากคุณเลื่อนแนวนอน) และขนาด:
flow.itemSize = ...;
flow.minimumInteritemSpacing = ...;
collection.collectionViewLayout
ต้องการนักแสดงตามตัวอย่างโดย @Pooja: UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*) self.collectionViewLayout;
if let flow = collectionViewLayout as? UICollectionViewFlowLayout { flow.itemSize = CGSize(width: 100, height: 100) }
สวิฟท์ 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
แก้ไข XCode 11.4 และรวดเร็ว 5
let flow = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
ไม่ทำงาน ใช้งานด้านล่าง
let flow = UICollectionViewFlowLayout()
backgroundColor
collectionView
หรืออะไรก็ตามที่ดูสุด ๆ
เพียงเพื่อแก้ไขข้อมูลที่ผิดในหน้านี้:
1- ขั้นต่ำInteritemSpacing : ระยะห่างต่ำสุดที่จะใช้ระหว่างรายการในแถวเดียวกัน
ค่าเริ่มต้น: 10.0
(สำหรับตารางเลื่อนแนวตั้งค่านี้แสดงระยะห่างต่ำสุดระหว่างรายการในแถวเดียวกัน)
2- MinimumLineSpacing : ระยะห่างต่ำสุดที่จะใช้ระหว่างบรรทัดของรายการในตาราง
ในขณะที่กระทู้นี้มีคำตอบที่เป็นประโยชน์มากมาย แต่ฉันต้องการเพิ่มเวอร์ชั่น Swift ที่ทันสมัยโดยยึดตามคำตอบของ William Hu นอกจากนี้ยังปรับปรุงสองสิ่ง:
นี่คือรหัส:
// 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)
itemsInOneLine
เป็น 1 แล้วจะทำให้ NaN หารด้วยศูนย์ที่นี่:itemsInOneLine / (itemsInOneLine - 1)
ใช้setMinimumLineSpacing:
และsetMinimumInteritemSpacing:
บนUICollectionViewFlowLayout
-Object
การใช้collectionViewFlowLayout.sectionInset
หรือcollectionView:layout:insetForSectionAtIndex:
ถูกต้อง
อย่างไรก็ตามหาก collectionView ของคุณมีหลายส่วนและคุณต้องการเพิ่มระยะขอบให้กับทั้ง collectionView ฉันขอแนะนำให้ใช้ scrollView contentInset:
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);
หากต้องการเว้นช่องว่างระหว่างCollectionItem
ใช้สิ่งนี้
เขียนสองบรรทัดนี้ใน viewdidload
UICollectionViewFlowLayout *collectionViewLayout = (UICollectionViewFlowLayout*)self.collectionView.collectionViewLayout;
collectionViewLayout.sectionInset = UIEdgeInsetsMake(<CGFloat top>, <CGFloat left>, <CGFloat bottom>, <CGFloat right>)
ตั้งค่า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);
}
ในวัตถุประสงค์ -C
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;
สิ่งที่คุณต้องทำคือเปลี่ยนค่า itemsPerRow และจะอัปเดตจำนวนรายการต่อแถวตามลำดับ นอกจากนี้คุณสามารถเปลี่ยนค่าระยะห่างหากคุณต้องการระยะห่างทั่วไปมากขึ้นหรือน้อยลง
สำหรับการเพิ่มระยะขอบให้กับเซลล์ที่ระบุคุณสามารถใช้เค้าโครงการไหลที่กำหนดเองนี้ได้ 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
}
}
ใน swift 4 และ autoLayout คุณสามารถใช้ส่วนการตั้งค่าเช่นนี้:
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
หากต้องการเพิ่มการแยก 10px ระหว่างแต่ละส่วนให้เขียนสิ่งนี้
flowLayout.sectionInset = UIEdgeInsetsMake(0.0, 0.0,10,0);
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
return UIEdgeInsetsMake(7, 10, 5, 10);
}