如何以编程方式创建 UICollectionViewCell
Posted
技术标签:
【中文标题】如何以编程方式创建 UICollectionViewCell【英文标题】:How to create UICollectionViewCell programmatically 【发布时间】:2016-09-11 17:31:45 【问题描述】:我正在尝试以编程方式创建 UICollectionView
。
我需要在单元格内添加标签,所以我创建了CollectionViewCell
类。
这是课程:
import UIKit
class MyCollectionViewCell: UICollectionViewCell
override init(frame: CGRect)
super.init(frame: frame)
required init?(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
这是collectionView的实现类:
import UIKit
class TwoViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UICollectionViewDelegate
let leftAndRightPaddings: CGFloat = 80.0
let numberOfItemsPerRow: CGFloat = 7.0
let screenSize: CGRect = UIScreen.main.bounds
private let cellReuseIdentifier = "collectionCell"
var items = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"]
override func viewDidLoad()
super.viewDidLoad()
let flowLayout = UICollectionViewFlowLayout()
let collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: flowLayout)
collectionView.register(MyCollectionViewCell.self, forCellWithReuseIdentifier: cellReuseIdentifier)
collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "collectionCell")
collectionView.delegate = self
collectionView.dataSource = self
collectionView.backgroundColor = UIColor.cyan
self.view.addSubview(collectionView)
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return self.items.count
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellReuseIdentifier, for: indexPath) as! MyCollectionViewCell
cell.backgroundColor = UIColor.green
return cell
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
let width = (screenSize.width-leftAndRightPaddings)/numberOfItemsPerRow
return CGSize(width: width, height: width)
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets
return UIEdgeInsets(top: 20, left: 8, bottom: 5, right: 8)
生成单元格时发生错误:
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellReuseIdentifier, forIndexPath: indexPath) as! MyCollectionViewCell
错误是:
Could not cast value of type 'UICollectionViewCell' (0x1033cc820) to 'CollectionViewProgramatically.MyCollectionViewCell' (0x1015a4f88).
【问题讨论】:
【参考方案1】:尝试将此代码复制并粘贴到您的 xcode 中,它应该可以工作
//
// HomeVIewController.swift
// Photolancer
//
// Created by Lee SangJoon on 9/8/16.
// Copyright © 2016 Givnite. All rights reserved.
//
import UIKit
class HomeViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout
var collectionview: UICollectionView!
var cellId = "Cell"
override func viewDidLoad()
super.viewDidLoad()
// Create an instance of UICollectionViewFlowLayout since you cant
// Initialize UICollectionView without a layout
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
layout.itemSize = CGSize(width: view.frame.width, height: 700)
collectionview = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
collectionview.dataSource = self
collectionview.delegate = self
collectionview.registerClass(FreelancerCell.self, forCellWithReuseIdentifier: cellId)
collectionview.showsVerticalScrollIndicator = false
collectionview.backgroundColor = UIColor.whiteColor()
self.view.addSubview(collectionview)
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return 10
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
let cell = collectionview.dequeueReusableCellWithReuseIdentifier(cellId, forIndexPath: indexPath) as! FreelancerCell
return cell
class FreelancerCell: UICollectionViewCell
let profileImageButton: UIButton =
let button = UIButton()
button.backgroundColor = UIColor.whiteColor()
button.layer.cornerRadius = 18
button.clipsToBounds = true
button.setImage(UIImage(named: "Profile"), forState: .Normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
()
let nameLabel: UILabel =
let label = UILabel()
label.font = UIFont.systemFontOfSize(14)
label.textColor = UIColor.darkGrayColor()
label.text = "Bob Lee"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let distanceLabel: UILabel =
let label = UILabel()
label.textColor = UIColor.lightGrayColor()
label.font = UIFont.systemFontOfSize(14)
label.text = "30000 miles"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let pricePerHourLabel: UILabel =
let label = UILabel()
label.textColor = UIColor.darkGrayColor()
label.font = UIFont.systemFontOfSize(14)
label.text = "$40/hour"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let ratingLabel: UILabel =
let label = UILabel()
label.textColor = UIColor.lightGrayColor()
label.font = UIFont.systemFontOfSize(14)
label.text = "4.9+"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let showCaseImageView: UIImageView =
let imageView = UIImageView()
imageView.backgroundColor = UIColor.whiteColor()
imageView.image = UIImage(named: "Profile")
imageView.translatesAutoresizingMaskIntoConstraints = false
return imageView
()
let likesLabel: UILabel =
let label = UILabel()
label.textColor = UIColor.lightGrayColor()
label.font = UIFont.systemFontOfSize(14)
label.text = "424 likes"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let topSeparatorView: UIView =
let view = UIView()
view.backgroundColor = UIColor.darkGrayColor()
view.translatesAutoresizingMaskIntoConstraints = false
return view
()
let bottomSeparatorView: UIView =
let view = UIView()
view.backgroundColor = UIColor.darkGrayColor()
view.translatesAutoresizingMaskIntoConstraints = false
return view
()
let likeButton: UIButton =
let button = UIButton()
button.setTitle("Like", forState: .Normal)
button.titleLabel?.font = UIFont.systemFontOfSize(18)
button.setTitleColor(UIColor.darkGrayColor(), forState: .Normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
()
let hireButton: UIButton =
let button = UIButton()
button.setTitle("Hire", forState: .Normal)
button.titleLabel?.font = UIFont.systemFontOfSize(18)
button.setTitleColor(UIColor.darkGrayColor(), forState: .Normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
()
let messageButton: UIButton =
let button = UIButton()
button.setTitle("Message", forState: .Normal)
button.titleLabel?.font = UIFont.systemFontOfSize(18)
button.setTitleColor(UIColor.darkGrayColor(), forState: .Normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
()
let stackView: UIStackView =
let sv = UIStackView()
sv.axis = UILayoutConstraintAxis.Horizontal
sv.alignment = UIStackViewAlignment.Center
sv.distribution = UIStackViewDistribution.FillEqually
sv.translatesAutoresizingMaskIntoConstraints = false;
return sv
()
override init(frame: CGRect)
super.init(frame: frame)
addViews()
func addViews()
backgroundColor = UIColor.blackColor()
addSubview(profileImageButton)
addSubview(nameLabel)
addSubview(distanceLabel)
addSubview(pricePerHourLabel)
addSubview(ratingLabel)
addSubview(showCaseImageView)
addSubview(likesLabel)
addSubview(topSeparatorView)
addSubview(bottomSeparatorView)
// Stack View
addSubview(likeButton)
addSubview(messageButton)
addSubview(hireButton)
addSubview(stackView)
profileImageButton.leftAnchor.constraintEqualToAnchor(leftAnchor, constant: 5).active = true
profileImageButton.topAnchor.constraintEqualToAnchor(topAnchor, constant: 10).active = true
profileImageButton.heightAnchor.constraintEqualToConstant(36).active = true
profileImageButton.widthAnchor.constraintEqualToConstant(36).active = true
nameLabel.leftAnchor.constraintEqualToAnchor(profileImageButton.rightAnchor, constant: 5).active = true
nameLabel.centerYAnchor.constraintEqualToAnchor(profileImageButton.centerYAnchor, constant: -8).active = true
nameLabel.rightAnchor.constraintEqualToAnchor(pricePerHourLabel.leftAnchor).active = true
distanceLabel.leftAnchor.constraintEqualToAnchor(nameLabel.leftAnchor).active = true
distanceLabel.centerYAnchor.constraintEqualToAnchor(profileImageButton.centerYAnchor, constant: 8).active = true
distanceLabel.widthAnchor.constraintEqualToConstant(300)
pricePerHourLabel.rightAnchor.constraintEqualToAnchor(rightAnchor, constant: -10).active = true
pricePerHourLabel.centerYAnchor.constraintEqualToAnchor(nameLabel.centerYAnchor).active = true
// Distance depeneded on the priceLabel and distance Label
ratingLabel.rightAnchor.constraintEqualToAnchor(pricePerHourLabel.rightAnchor).active = true
ratingLabel.centerYAnchor.constraintEqualToAnchor(distanceLabel.centerYAnchor).active = true
showCaseImageView.topAnchor.constraintEqualToAnchor(profileImageButton.bottomAnchor, constant: 10).active = true
showCaseImageView.widthAnchor.constraintEqualToAnchor(widthAnchor).active = true
showCaseImageView.heightAnchor.constraintEqualToConstant(UIScreen.mainScreen().bounds.width - 20).active = true
likesLabel.topAnchor.constraintEqualToAnchor(showCaseImageView.bottomAnchor, constant: 10).active = true
likesLabel.leftAnchor.constraintEqualToAnchor(profileImageButton.leftAnchor).active = true
topSeparatorView.topAnchor.constraintEqualToAnchor(likesLabel.bottomAnchor, constant: 10).active = true
topSeparatorView.widthAnchor.constraintEqualToAnchor(widthAnchor).active = true
topSeparatorView.heightAnchor.constraintEqualToConstant(0.5).active = true
stackView.addArrangedSubview(likeButton)
stackView.addArrangedSubview(hireButton)
stackView.addArrangedSubview(messageButton)
stackView.topAnchor.constraintEqualToAnchor(topSeparatorView.bottomAnchor, constant: 4).active = true
stackView.widthAnchor.constraintEqualToAnchor(widthAnchor).active = true
stackView.centerXAnchor.constraintEqualToAnchor(centerXAnchor).active = true
bottomSeparatorView.topAnchor.constraintEqualToAnchor(stackView.bottomAnchor, constant: 4).active = true
bottomSeparatorView.widthAnchor.constraintEqualToAnchor(widthAnchor).active = true
bottomSeparatorView.heightAnchor.constraintEqualToConstant(0.5).active = true
required init?(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
【讨论】:
要了解如何使用闭包创建对象,请随时参考这篇文章,blog.bobthedeveloper.io/… 小注意,不要给单元格本身添加子视图,but usecontentView
property instead: 要配置单元格的外观,将需要的视图添加为视图的子视图来呈现数据项的内容在 contentView 属性中。不要直接将子视图添加到单元格本身。
这段代码很棒,但是在viewDidLayoutSubviews
而不是viewDidLoad
中设置您的收藏视图,请参阅此处的讨论:***.com/questions/49742156/…
谢谢,这对我有用。作为一个良好的开发人员实践,我不建议任何人只是复制和粘贴它。相反,鼓励他们写/打字。赞成。
我必须在 required init?(coder aDecoder: NSCoder)
中添加 super.init(coder: aDecoder)
才能使用 Swift 5。以防其他人遇到此问题。【参考方案2】:
你的问题就在这里。在您的viewDidLoad()
中,您注册了两次collectionView 单元格。您在第一行将collectionview 的单元格注册到您的自定义单元格类,然后在第二行将其注册到类UICollectionViewCell
。
collectionView.registerClass(MyCollectionViewCell.self, forCellWithReuseIdentifier: cellReuseIdentifier)
collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "collectionCell")
只需删除第二行,您的代码就可以工作了。
【讨论】:
【参考方案3】:我将 Bob Lee answer 更改为 swift 4
import UIKit
class noNibCollectionViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout
var collectionview: UICollectionView!
var cellId = "Cell"
override func viewDidLoad()
super.viewDidLoad()
// Create an instance of UICollectionViewFlowLayout since you cant
// Initialize UICollectionView without a layout
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
layout.itemSize = CGSize(width: view.frame.width, height: 700)
collectionview = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
collectionview.dataSource = self
collectionview.delegate = self
collectionview.register(FreelancerCell.self, forCellWithReuseIdentifier: cellId)
collectionview.showsVerticalScrollIndicator = false
collectionview.backgroundColor = UIColor.white
self.view.addSubview(collectionview)
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return 10
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
let cell = collectionview.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as! FreelancerCell
return cell
class FreelancerCell: UICollectionViewCell
let profileImageButton: UIButton =
let button = UIButton()
button.backgroundColor = UIColor.white
button.layer.cornerRadius = 18
button.clipsToBounds = true
button.setImage(UIImage(named: "Profile"), for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
()
let nameLabel: UILabel =
let label = UILabel()
label.font = UIFont.systemFont(ofSize: 14)
label.textColor = UIColor.darkGray
label.text = "Bob Lee"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let distanceLabel: UILabel =
let label = UILabel()
label.textColor = UIColor.lightGray
label.font = UIFont.systemFont(ofSize: 14)
label.text = "30000 miles"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let pricePerHourLabel: UILabel =
let label = UILabel()
label.textColor = UIColor.darkGray
label.font = UIFont.systemFont(ofSize: 14)
label.text = "$40/hour"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let ratingLabel: UILabel =
let label = UILabel()
label.textColor = UIColor.lightGray
label.font = UIFont.systemFont(ofSize: 14)
label.text = "4.9+"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let showCaseImageView: UIImageView =
let imageView = UIImageView()
imageView.backgroundColor = UIColor.white
imageView.image = UIImage(named: "Profile")
imageView.translatesAutoresizingMaskIntoConstraints = false
return imageView
()
let likesLabel: UILabel =
let label = UILabel()
label.textColor = UIColor.lightGray
label.font = UIFont.systemFont(ofSize: 14)
label.text = "424 likes"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let topSeparatorView: UIView =
let view = UIView()
view.backgroundColor = UIColor.darkGray
view.translatesAutoresizingMaskIntoConstraints = false
return view
()
let bottomSeparatorView: UIView =
let view = UIView()
view.backgroundColor = UIColor.darkGray
view.translatesAutoresizingMaskIntoConstraints = false
return view
()
let likeButton: UIButton =
let button = UIButton()
button.setTitle("Like", for: .normal)
button.titleLabel?.font = UIFont.systemFont(ofSize: 18)
button.setTitleColor(UIColor.darkGray, for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
()
let hireButton: UIButton =
let button = UIButton()
button.setTitle("Hire", for: .normal)
button.titleLabel?.font = UIFont.systemFont(ofSize: 18)
button.setTitleColor(UIColor.darkGray, for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
()
let messageButton: UIButton =
let button = UIButton()
button.setTitle("Message", for: .normal)
button.titleLabel?.font = UIFont.systemFont(ofSize: 18)
button.setTitleColor(UIColor.darkGray, for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
()
let stackView: UIStackView =
let sv = UIStackView()
sv.axis = UILayoutConstraintAxis.horizontal
sv.alignment = UIStackViewAlignment.center
sv.distribution = UIStackViewDistribution.fillEqually
sv.translatesAutoresizingMaskIntoConstraints = false;
return sv
()
override init(frame: CGRect)
super.init(frame: frame)
addViews()
func addViews()
backgroundColor = UIColor.black
addSubview(profileImageButton)
addSubview(nameLabel)
addSubview(distanceLabel)
addSubview(pricePerHourLabel)
addSubview(ratingLabel)
addSubview(showCaseImageView)
addSubview(likesLabel)
addSubview(topSeparatorView)
addSubview(bottomSeparatorView)
// Stack View
addSubview(likeButton)
addSubview(messageButton)
addSubview(hireButton)
addSubview(stackView)
profileImageButton.leftAnchor.constraint(equalTo: leftAnchor, constant: 5).isActive = true
profileImageButton.topAnchor.constraint(equalTo: topAnchor, constant: 10).isActive = true
profileImageButton.heightAnchor.constraint(equalToConstant: 36).isActive = true
profileImageButton.widthAnchor.constraint(equalToConstant: 36).isActive = true
nameLabel.leftAnchor.constraint(equalTo: profileImageButton.rightAnchor, constant: 5).isActive = true
nameLabel.centerYAnchor.constraint(equalTo: profileImageButton.centerYAnchor, constant: -8).isActive = true
nameLabel.rightAnchor.constraint(equalTo: pricePerHourLabel.leftAnchor).isActive = true
distanceLabel.leftAnchor.constraint(equalTo: nameLabel.leftAnchor).isActive = true
distanceLabel.centerYAnchor.constraint(equalTo: profileImageButton.centerYAnchor, constant: 8).isActive = true
distanceLabel.widthAnchor.constraint(equalToConstant: 300)
pricePerHourLabel.rightAnchor.constraint(equalTo: rightAnchor, constant: -10).isActive = true
pricePerHourLabel.centerYAnchor.constraint(equalTo: nameLabel.centerYAnchor).isActive = true
// Distance depeneded on the priceLabel and distance Label
ratingLabel.rightAnchor.constraint(equalTo: pricePerHourLabel.rightAnchor).isActive = true
ratingLabel.centerYAnchor.constraint(equalTo: distanceLabel.centerYAnchor).isActive = true
showCaseImageView.topAnchor.constraint(equalTo: profileImageButton.bottomAnchor, constant: 10).isActive = true
showCaseImageView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
showCaseImageView.heightAnchor.constraint(equalToConstant: UIScreen.main.bounds.width - 20).isActive = true
likesLabel.topAnchor.constraint(equalTo: showCaseImageView.bottomAnchor, constant: 10).isActive = true
likesLabel.leftAnchor.constraint(equalTo: profileImageButton.leftAnchor).isActive = true
topSeparatorView.topAnchor.constraint(equalTo: likesLabel.bottomAnchor, constant: 10).isActive = true
topSeparatorView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
topSeparatorView.heightAnchor.constraint(equalToConstant: 0.5).isActive = true
stackView.addArrangedSubview(likeButton)
stackView.addArrangedSubview(hireButton)
stackView.addArrangedSubview(messageButton)
stackView.topAnchor.constraint(equalTo: topSeparatorView.bottomAnchor, constant: 4).isActive = true
stackView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
bottomSeparatorView.topAnchor.constraint(equalTo: stackView.bottomAnchor, constant: 4).isActive = true
bottomSeparatorView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
bottomSeparatorView.heightAnchor.constraint(equalToConstant: 0.5).isActive = true
required init?(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
【讨论】:
这段代码很棒,但是在viewDidLayoutSubviews
而不是viewDidLoad
中设置您的收藏视图,请参阅此处的讨论:***.com/questions/49742156/…【参考方案4】:
Bob Lee 的响应更新为 Swift 5.1
class HomeViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout
var collectionview: UICollectionView!
var cellId = "Cell"
override func viewDidLoad()
super.viewDidLoad()
// Create an instance of UICollectionViewFlowLayout since you cant
// Initialize UICollectionView without a layout
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
layout.itemSize = CGSize(width: view.frame.width, height: 700)
collectionview = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
collectionview.dataSource = self
collectionview.delegate = self
collectionview.register(FreelancerCell.self, forCellWithReuseIdentifier: cellId)
collectionview.showsVerticalScrollIndicator = false
collectionview.backgroundColor = UIColor.white
self.view.addSubview(collectionview)
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
return 10
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
let cell = collectionview.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath as IndexPath) as! FreelancerCell
return cell
class FreelancerCell: UICollectionViewCell
let profileImageButton: UIButton =
let button = UIButton()
button.backgroundColor = UIColor.white
button.layer.cornerRadius = 18
button.clipsToBounds = true
button.setImage(UIImage(named: "Profile"), for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
()
let nameLabel: UILabel =
let label = UILabel()
label.font = UIFont.systemFont(ofSize: 14)
label.textColor = UIColor.darkGray
label.text = "Bob Lee"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let distanceLabel: UILabel =
let label = UILabel()
label.textColor = UIColor.lightGray
label.font = UIFont.systemFont(ofSize: 14)
label.text = "30000 miles"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let pricePerHourLabel: UILabel =
let label = UILabel()
label.textColor = UIColor.darkGray
label.font = UIFont.systemFont(ofSize: 14)
label.text = "$40/hour"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let ratingLabel: UILabel =
let label = UILabel()
label.textColor = UIColor.lightGray
label.font = UIFont.systemFont(ofSize: 14)
label.text = "4.9+"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let showCaseImageView: UIImageView =
let imageView = UIImageView()
imageView.backgroundColor = UIColor.white
imageView.image = UIImage(named: "Profile")
imageView.translatesAutoresizingMaskIntoConstraints = false
return imageView
()
let likesLabel: UILabel =
let label = UILabel()
label.textColor = UIColor.lightGray
label.font = UIFont.systemFont(ofSize: 14)
label.text = "424 likes"
label.translatesAutoresizingMaskIntoConstraints = false
return label
()
let topSeparatorView: UIView =
let view = UIView()
view.backgroundColor = UIColor.darkGray
view.translatesAutoresizingMaskIntoConstraints = false
return view
()
let bottomSeparatorView: UIView =
let view = UIView()
view.backgroundColor = UIColor.darkGray
view.translatesAutoresizingMaskIntoConstraints = false
return view
()
let likeButton: UIButton =
let button = UIButton()
button.setTitle("Like", for: .normal)
button.titleLabel?.font = UIFont.systemFont(ofSize: 18)
button.setTitleColor(UIColor.darkGray, for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
()
let hireButton: UIButton =
let button = UIButton()
button.setTitle("Hire", for: .normal)
button.titleLabel?.font = UIFont.systemFont(ofSize: 18)
button.setTitleColor(UIColor.darkGray, for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
()
let messageButton: UIButton =
let button = UIButton()
button.setTitle("Message", for: .normal)
button.titleLabel?.font = UIFont.systemFont(ofSize: 18)
button.setTitleColor(UIColor.darkGray, for: .normal)
button.translatesAutoresizingMaskIntoConstraints = false
return button
()
let stackView: UIStackView =
let sv = UIStackView()
sv.axis = NSLayoutConstraint.Axis.horizontal
sv.alignment = UIStackView.Alignment.center
sv.distribution = UIStackView.Distribution.fillEqually
sv.translatesAutoresizingMaskIntoConstraints = false;
return sv
()
override init(frame: CGRect)
super.init(frame: frame)
addViews()
func addViews()
backgroundColor = UIColor.black
addSubview(profileImageButton)
addSubview(nameLabel)
addSubview(distanceLabel)
addSubview(pricePerHourLabel)
addSubview(ratingLabel)
addSubview(showCaseImageView)
addSubview(likesLabel)
addSubview(topSeparatorView)
addSubview(bottomSeparatorView)
// Stack View
addSubview(likeButton)
addSubview(messageButton)
addSubview(hireButton)
addSubview(stackView)
profileImageButton.leftAnchor.constraint(equalTo: leftAnchor, constant: 5).isActive = true
profileImageButton.topAnchor.constraint(equalTo: topAnchor, constant: 10).isActive = true
profileImageButton.heightAnchor.constraint(equalToConstant: 36).isActive = true
profileImageButton.widthAnchor.constraint(equalToConstant: 36).isActive = true
nameLabel.leftAnchor.constraint(equalTo: profileImageButton.rightAnchor, constant: 5).isActive = true
nameLabel.centerYAnchor.constraint(equalTo: profileImageButton.centerYAnchor, constant: -8).isActive = true
nameLabel.rightAnchor.constraint(equalTo: pricePerHourLabel.leftAnchor).isActive = true
distanceLabel.leftAnchor.constraint(equalTo: nameLabel.leftAnchor).isActive = true
distanceLabel.centerYAnchor.constraint(equalTo: profileImageButton.centerYAnchor, constant: 8).isActive = true
distanceLabel.widthAnchor.constraint(equalToConstant: 300)
pricePerHourLabel.rightAnchor.constraint(equalTo: rightAnchor, constant: -10).isActive = true
pricePerHourLabel.centerYAnchor.constraint(equalTo: nameLabel.centerYAnchor).isActive = true
// Distance depeneded on the priceLabel and distance Label
ratingLabel.rightAnchor.constraint(equalTo: pricePerHourLabel.rightAnchor).isActive = true
ratingLabel.centerYAnchor.constraint(equalTo: distanceLabel.centerYAnchor).isActive = true
showCaseImageView.topAnchor.constraint(equalTo: profileImageButton.bottomAnchor, constant: 10).isActive = true
showCaseImageView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
showCaseImageView.heightAnchor.constraint(equalToConstant: UIScreen.main.bounds.width - 20).isActive = true
likesLabel.topAnchor.constraint(equalTo: showCaseImageView.bottomAnchor, constant: 10).isActive = true
likesLabel.leftAnchor.constraint(equalTo: profileImageButton.leftAnchor).isActive = true
topSeparatorView.topAnchor.constraint(equalTo: likesLabel.bottomAnchor, constant: 10).isActive = true
topSeparatorView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
topSeparatorView.heightAnchor.constraint(equalToConstant: 0.5).isActive = true
stackView.addArrangedSubview(likeButton)
stackView.addArrangedSubview(hireButton)
stackView.addArrangedSubview(messageButton)
stackView.topAnchor.constraint(equalTo: topSeparatorView.bottomAnchor, constant: 4).isActive = true
stackView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
stackView.centerXAnchor.constraint(equalTo: centerXAnchor).isActive = true
bottomSeparatorView.topAnchor.constraint(equalTo: stackView.bottomAnchor, constant: 4).isActive = true
bottomSeparatorView.widthAnchor.constraint(equalTo: widthAnchor).isActive = true
bottomSeparatorView.heightAnchor.constraint(equalToConstant: 0.5).isActive = true
required init?(coder aDecoder: NSCoder)
fatalError("init(coder:) has not been implemented")
【讨论】:
【参考方案5】:let collection :UICollectionView =
let layout = UICollectionViewFlowLayout()
let collection = UICollectionView(frame: CGRect(x: 0, y: 0, width: 0, height: 0), collectionViewLayout: layout)
layout.scrollDirection = .horizontal
collection.translatesAutoresizingMaskIntoConstraints = false
collection.backgroundColor = .clear
return collection
()
【讨论】:
CGRect.zero 也会这样做。以上是关于如何以编程方式创建 UICollectionViewCell的主要内容,如果未能解决你的问题,请参考以下文章