나는 CollectionView
. 자동 레이아웃을 사용할 때 셀의 크기가 변경되지 않고 정렬이 변경됩니다.
이제는 크기를 예를 들어 변경하고 싶습니다.
//var size = CGSize(width: self.view.frame.width/10, height: self.view.frame.width/10)
내 설정을 시도 CellForItemAtIndexPath
collectionCell.size = size
그래도 작동하지 않았습니다.
이것을 달성하는 방법이 있습니까?
편집 :
대답은 CollectionView 너비와 높이 자체 만 변경하는 것 같습니다. 제약 조건에 충돌이있을 수 있습니까? 그것에 대한 어떤 아이디어?
답변
이 방법을 사용하여 사용자 지정 셀 높이 너비를 설정합니다.
이 프로토콜을 추가해야합니다.
UICollectionViewDelegate
UICollectionViewDataSource
UICollectionViewDelegateFlowLayout
당신이 사용하는 경우 신속 5 또는 엑스 코드 (11) 와 나중에는 세트에 필요 Estimate Size
로 none
제대로 작동하게하기 위해 스토리 보드를 사용하여. 아래 코드보다 설정하지 않으면 예상대로 작동하지 않습니다.
Swift 4 이상
extension YourViewController: UICollectionViewDelegate {
//Write Delegate Code Here
}
extension YourViewController: UICollectionViewDataSource {
//Write DataSource Code Here
}
extension YourViewController: UICollectionViewDelegateFlowLayout {
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: screenWidth, height: screenWidth)
}
}
목표 -C
@interface YourViewController : UIViewController<UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
return CGSizeMake(CGRectGetWidth(collectionView.frame), (CGRectGetHeight(collectionView.frame)));
}
답변
선언에 프로토콜을 추가해야합니다 UICollectionViewDelegateFlowLayout
.class
class MyCollectionViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout
{
//MARK: - UICollectionViewDelegateFlowLayout
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
return CGSize(width: 100.0, height: 100.0)
}
}
답변
스토리 보드를 사용하고 UICollectionViewDelegateFlowLayout 을 재정의하는 경우 신속한 5 및 Xcode 11에서도 Estimate size를 None으로 설정합니다.
답변
마침내 답을 얻었습니다. 확장 UICollectionViewDelegateFlowLayout
해야합니다 이것은 위의 답변으로 작업해야합니다.
답변
신속한 4.1
CollectionView의 크기를 변경하는 방법에는 두 가지가 있습니다.
첫 번째 방법 ->이 프로토콜 추가 UICollectionViewDelegateFlowLayout
for 제 경우에는 셀을 한 줄에 세 부분으로 나누고 싶습니다. 아래 코드를 작성했습니다.
extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource ,UICollectionViewDelegateFlowLayout{
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
// In this function is the code you must implement to your code project if you want to change size of Collection view
let width = (view.frame.width-20)/3
return CGSize(width: width, height: width)
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return collectionData.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath)
if let label = cell.viewWithTag(100) as? UILabel {
label.text = collectionData[indexPath.row]
}
return cell
}
}
두 번째 방법은 -> 당신은 하지 않습니다 추가해야 UICollectionViewDelegateFlowLayout을 하지만 당신은 몇 가지 코드를 작성할 필요가 있는 viewDidLoad 함수를 아래 코드로 대신
class ViewController: UIViewController {
@IBOutlet weak var collectionView1: UICollectionView!
var collectionData = ["1.", "2.", "3.", "4.", "5.", "6.", "7.", "8.", "9.", "10.", "11.", "12."]
override func viewDidLoad() {
super.viewDidLoad()
let width = (view.frame.width-20)/3
let layout = collectionView.collectionViewLayout as! UICollectionViewFlowLayout
layout.itemSize = CGSize(width: width, height: width)
}
}
extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return collectionData.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCell", for: indexPath)
if let label = cell.viewWithTag(100) as? UILabel {
label.text = collectionData[indexPath.row]
}
return cell
}
}
첫 번째 방법 또는 두 번째 방법으로 코드를 작성하면 위와 동일한 결과를 얻을 수 있습니다. 내가 썼어. 그것은 나를 위해 일했습니다
답변
iPhone 크기에 따른 크기 비율 :
iPhone 크기와 관련하여 셀의 너비와 높이를 다르게 할 수있는 방법은 다음과 같습니다.
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
let width = (self.view.frame.size.width - 12 * 3) / 3 //some width
let height = width * 1.5 //ratio
return CGSize(width: width, height: height)
}
이 답변이 작동하려면 셀에서 AutoLayout 제약 조건을 비활성화해야 할 수도 있습니다.
답변
컬렉션보기에는 레이아웃 개체가 있습니다. 귀하의 경우에는 아마도 흐름 레이아웃 ( UICollectionViewFlowLayout ) 일 것입니다. 흐름 레이아웃의 itemSize
속성을 설정합니다 .