Ios 在collectionView单元格上添加边框
用户每次单击特定单元格时,该单元格都会有边框。问题是,当我来回滚动时,边框是选择随机单元格来设置边框Ios 在collectionView单元格上添加边框,ios,swift,Ios,Swift,用户每次单击特定单元格时,该单元格都会有边框。问题是,当我来回滚动时,边框是选择随机单元格来设置边框 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { let cell = collectionView.cellForItem(at: indexPath) cell?.layer.borderColor = UIColor.blue.cgC
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.layer.borderColor = UIColor.blue.cgColor
cell?.layer.borderWidth = 1
}
以防万一,你正在寻找DIDDENSELECT部分
func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath)
cell?.layer.borderColor = UIColor.clear.cgColor
cell?.layer.borderWidth = 1
}
这是因为细胞的可重用性。您应该在单元格模型中使用属性来跟踪所选状态-
isSelected:Bool
现在在cellForItem
方法中,如果isSelected
为true
,则必须放置if-else并使单元格带边框
这里要注意的是,不要忘记放置else部分并删除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
}
由于手机的重复使用,您目前面临着这个问题。要解决这个问题:
选择单元格时(在
didSelectItemAt
中),将indexPath.row
保存在局部变量中。在cellForRow
方法中,放入如下检查:如果indexath.row==savedValue,则borderColor将为蓝色,否则为正常颜色。您可以这样使用我的方法:
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
}
您可以使用“selectedRow”轻松地将边框添加到selectedCell
是否仅向选定单元格添加边框?是,仅向选定单元格添加边框。同时也要避免在随机单元格上添加边框。对于那些否决这一点的人,大声说出来。为什么?collectionView.reloadData()将始终在每次selectedIndexPath更改值时调用?是的,它将在每次单击@jay123456时反映出来
import 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()
}
}