将单元格的子视图移动到前面快速

时间:2018-03-27 17:26:45

标签: ios swift uitableview cell layer

我有一个按钮,上面有一个按钮。当我按下按钮时,我会开始动画,表明正在准备。我在@IBAction函数中这样做:(在我的自定义tableViewCell函数中)。

@IBAction func playNowTapped(_ sender: UIButton) {
    let loadingShape = CAShapeLayer()
    //Some animating of the shape
}

我在@IBAction内定义了这个形状,因为如果再次按下按钮,该过程应该重复

但是,因为只有设备上显示的必要单元格被加载到tableView的cellForRowAt函数中的一个块中,所以如果我在加载动画时向下滚动,我的动画会重复每隔几个单元格。

到目前为止我所做的是通过定义一个函数并在按钮的@IBAction函数中调用它来附加到我之前所有按下按钮的列表中,如下所示:

func findCell() {
    //Iterate tableView list and compare to current cellText
    for value in list {
        if value == cellText.text {
             //If found, checking if value is already stored in pressedBefore
             for selected in pressedBefore {
                 if selected == value { return }
             }
             alreadyPlay.append(song: cellText.text!)
        }
    }
}

然后,在我的cellForRowAt函数中,我只做一个反向操作,它检查列表中的当前索引是否与已选择的索引中的任何值相同。

将所有这些过滤掉之后,我现在只有一个未选择的列表。但是,我现在不知道该怎么做。

奇怪的是,cell.bringSubview(tofront: cell.cellText) cell.bringSubview(tofront: cell.buttonText)并未改变子视图的顺序。我现在该怎么办? CAShapeLayer()是否可能不被视为子视图,而只是一个图层?

提前谢谢!

1 个答案:

答案 0 :(得分:2)

奇怪的是,cell.bringSubview(tofront:cell.cellText) cell.bringSubview(tofront:cell.buttonText)不会更改子视图的顺序。我现在该怎么办?

bringSubview(tofront :)仅适用于直接子视图。传统上,您的cellText和buttonText是cell.contentView的子视图。

所以试试

cell.contentView.bringSubview(tofront: cell.buttonText)

CAShapeLayer()是否可能不被视为子视图,但是     只有一层?

是的,CAShapeLayer继承自CALayer,仅被视为其视图的图层,可能需要通过layoutSubviews()draw()

进行更新

看到那些嵌套for循环和if语句,我想我会提供一种清理它的方法。

func findCell() {
    //find list elements that match cell's text and ensure it hasn't been pressed before
    list.filter { $0 == cellText.text && !pressedBefore.contains($0) }.forEach {
        alreadyPlay.append(alreadyPlayed(song: LeLabelOne.text!, artist: leLabelThree.text!))
    }
}

// alternative using Sets
func findCell() {
    let cellTextSet = Set(list).intersection([cellText.text])

    // find entries in cellTextSet that haven't been pressed before
    cellTextSet.subtract(Set(pressedBefore)).forEach {
        alreadyPlay.append(alreadyPlayed(song: LeLabelOne.text!, artist: leLabelThree.text!))
    }
}