gpt4 book ai didi

swift - UICollectionViewCell alpha 在使用 '.reloadItems' 时没有改变

转载 作者:行者123 更新时间:2023-11-28 05:47:49 25 4
gpt4 key购买 nike

我一直在使用 UICollectionView.reloadData() 来动态更新我的单元格,这非常有效,但它会导致动画非常笨拙。我连接到 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 并执行逻辑以确定单元格 UI。

这是方法代码:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "RepCollectionViewCell", for: indexPath) as! RepCollectionViewCell

let mask = CAShapeLayer()
let path = UIBezierPath(arcCenter: CGPoint(x: cell.bounds.midX, y: cell.bounds.midY),
radius: cell.bounds.width / 2, startAngle: -CGFloat.pi / 2, endAngle: 2 * .pi, clockwise: true)

path.close()

mask.frame = cell.bounds
mask.path = path.cgPath

var alpha = 1.0
var color = UIColor.white
var size = 0.0

switch reps[indexPath.row] {
case currentRep + 3:
size = FONT_SIZE / 4
case currentRep + 2:
size = FONT_SIZE / 3
case currentRep + 1:
size = FONT_SIZE / 2
case currentRep:
color = .green
size = FONT_SIZE
case currentRep - 1:
size = FONT_SIZE / 2
alpha = 0.75
case currentRep - 2:
size = FONT_SIZE / 3
alpha = 0.50
case currentRep - 3:
size = FONT_SIZE / 4
alpha = 0.25
default:
color = .clear
alpha = 0
}

cell.layer.mask = mask
cell.repCount.text = String(reps[indexPath.row])
cell.backgroundColor = color
cell.repCount.font = UIFont(name: FONT_NAME, size: CGFloat(size))
cell.alpha = CGFloat(alpha)

return cell
}

现在如前所述,使用 UICollectionView.reloadData() 时 alpha 设置正确,但是,当我使用 UICollectionView.reloadItems(at: [IndexPaths]) 方法和传递一个 indexPaths 数组,单元格 alpha 不会更新。但是,背景颜色、字体大小、contentView alpha 等...将更新。

这是我用来生成需要更新的单元格的索引路径和后续调用的代码。

private func focusCollectionView()
{
self.MyUICollectionView.reloadItems(at: generateIndexPaths())
self.MyUICollectionView.scrollToItem(at: IndexPath(item: myVar - 1, section: 0), at: UICollectionView.ScrollPosition.centeredHorizontally, animated: true)
}

private func generateIndexPaths() -> [IndexPath]
{
var indexPaths = [IndexPath]()

if(myVar - 4 >= 0)
{
indexPaths.append(IndexPath(row: myVar - 4, section: 0))
}
if(myVar - 3 >= 0)
{
indexPaths.append(IndexPath(row: myVar - 3, section: 0))
}
if(myVar - 2 >= 0)
{
indexPaths.append(IndexPath(row: myVar - 2, section: 0))
}
if(myVar - 1 >= 0)
{
indexPaths.append(IndexPath(row: myVar - 1, section: 0))
}

indexPaths.append(IndexPath(row: myVar, section: 0))

if(myVar + 1 < _myOtherVar)
{
indexPaths.append(IndexPath(row: myVar + 1, section: 0))
}
if(myVar + 2 < _myOtherVar)
{
indexPaths.append(IndexPath(row: myVar + 2, section: 0))
}
if(myVar + 3 < _myOtherVar)
{
indexPaths.append(IndexPath(row: myVar + 3, section: 0))
}

return indexPaths
}

这是两个结果的演示,第一个使用“reloadData”,第二个使用“reloadItems”:https://imgur.com/a/ECOnYIj

我不知道为什么会发生这种情况以及如何解决它,有什么想法吗?

最佳答案

据我了解背景颜色应该显示出来?还是我误解了意图?

因此使用您的代码进行测试似乎未应用该单元格的 alpha,请参阅

view

想法

将单元格的 backgroundColor 设置为 .clear 将允许我们使用 contentView 的 alpha,并且我们仍然可以看到背景。

测试一下

在我使用的 UICollectionViewController 子类中:

self.collectionView.backgroundColor = .black

我在这里稍微修改了你的代码(就像 rmaddy 在他的回答中建议的那样):

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
...
cell.myLabel.text = String(reps[indexPath.row])
cell.contentView.alpha = 1
...

然后各改

  • cell.backgroundColor =cell.contentView.backgroundColor =

  • cell.alpha =cell.contentView.alpha =

在 MyUICollectionViewCell 中,我将单元格的背景颜色设置为 UIColor.clear:

self.backgroundColor = .clear

除此之外,CollectionViewCell的代码比较无趣,仅供引用:

class MyUICollectionViewCell: UICollectionViewCell {

let myLabel = UILabel()

override init(frame: CGRect) {
super.init(frame: frame)
self.backgroundColor = .clear
self.contentView.addSubview(self.myLabel)
self.myLabel.textAlignment = .center
self.myLabel.snp.makeConstraints { (maker) in
maker.edges.equalToSuperview()
}
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

}

在我的测试用例中,myVar 是选中项的索引,所以我去掉了 scrollToItem 中的 -1,这样它看起来像这样:

private func focusCollectionView()
{
self.collectionView.reloadItems(at: generateIndexPaths())
self.collectionView.scrollToItem(
at: IndexPath(item: myVar, section: 0),
at: .centeredHorizontally,
animated: true)
}

演示

所以在模拟器中测试时它看起来像这样:

Testing in Simulator

这就是您要找的吗?

关于swift - UICollectionViewCell alpha 在使用 '.reloadItems' 时没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54013365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com