每次用户点击特定单元格时,单元格都会有边框。问题是当我来回滚动时,边框选择随机单元格来设置边框。
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.layer.borderColor = UIColor.blue.cgColor
cell?.layer.borderWidth = 1
}
以防您正在寻找didDeselect部分
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.layer.borderColor = UIColor.clear.cgColor
cell?.layer.borderWidth = 1
}
答案 0 :(得分:4)
这是因为细胞的可重用性。您应该在单元格模型中获取属性以跟踪选定的状态 - isSelected: Bool
现在在cellForItem
方法中,如果isSelected
为true
,则必须放置if else并使您的单元格边界化。
请注意,请勿忘记在其他部分放置其他部分并删除边框。
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.layer.borderColor = UIColor.blue.cgColor
cell?.layer.borderWidth = 1
cell?.isSelected = true
}
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.layer.borderColor = UIColor.clear.cgColor
cell?.layer.borderWidth = 1
cell?.isSelected = false
}
override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
...
...
if cell.isSelected {
//put border logic
}else {
// remove border
}
return cell
}
答案 1 :(得分:3)
您可以使用" selectedRow"。
轻松地将边框添加到selectedCellimport UIKit
class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {
var selectedRow = -1
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 10
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath)
if selectedRow == indexPath.row {
cell.layer.borderColor = UIColor.blue.cgColor
cell.layer.borderWidth = 1
}
else {
cell.layer.borderWidth = 0
}
return cell
}
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
if selectedRow == indexPath.row {
selectedRow = -1
} else {
selectedRow = indexPath.row
}
collectionView.reloadData()
}
}
答案 2 :(得分:1)
你可以这样用我的方式:
var selectedIndexPath: NSIndexPath{
didSet{
collectionView.reloadData()
}
}
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
selectedIndexPath = indexPath
}
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
var borderColor: CGColor! = UIColor.clear.cgColor
var borderWidth: CGFloat = 0
if indexPath == selectedIndexPath{
borderColor = UIColor.brown.cgColor
borderWidth = 1 //or whatever you please
}else{
borderColor = UIColor.clear.cgColor
borderWidth = 0
}
cell.layer.borderWidth = borderWidth //You can use your component
cell.layer.borderColor = borderColor
}
答案 3 :(得分:0)
由于细胞重复使用,您目前正面临此问题。要解决这个问题:
选择单元格(在didSelectItemAt
中)时,将indexPath.row
保存在局部变量中。在cellForRow
方法中,检查如下:if indexPath.row == savedValue,borderColor将为蓝色,否则为正常颜色。