在tableView的单元格中,我正在尝试使用以下Swift代码定义渐变:
func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
var cell:UITableViewCell = self.tableView?.dequeueReusableCellWithIdentifier("cell") as UITableViewCell
cell.backgroundColor=UIColor.clearColor()
let gradient : CAGradientLayer = CAGradientLayer()
var arrayColors:Array<AnyObject> = [UIColor.blackColor().CGColor, UIColor.whiteColor().CGColor]
gradient.colors=arrayColors
gradient.frame = cell.bounds
cell.layer.insertSublayer(gradient, atIndex: UInt32(indexPath.row))
return cell
}
行为非常混乱:首次加载视图时,所有单元格都具有白色背景。如果我上下滚动,一些内容的单元格会消失(标题和副标题),渐变最终会出现在这些单元格中(随机,其他一些单元格保留白色背景)。 它与此演员表有关 - &gt; UInt32(indexPath.row)?
答案 0 :(得分:1)
渐变是视觉装饰。它特定于细胞类。细胞的外观是细胞的责任。它应该在细胞类中定义。它绝对不属于cellForRowAtIndexPath,它应该仅仅是为右行选择正确的单元格。 但是,您正在使用该方法配置单元格的内部结构,并结合排队的工作方式,会导致所有问题。
1)创建一个UITableViewCell的子类(以编程方式,IB ..这并不重要)
2)将awakeFromNib或layoutSubviews中的图层添加到backroundView属性。
3)在tableViewController中的viewDidLoad中注册单元格。
答案 1 :(得分:0)
我有类似的问题,我的错误是直接在单元格中插入带有渐变的新图层,尝试将新图层插入到这样的backgroundView
let gradient = CAGradientLayer()
// layer setup...
cell.backgroundView = UIView()
cell.backgroundView?.layer.insertSublayer(gradientLayer, atIndex: 0)
希望这有帮助。
答案 2 :(得分:0)
进一步扩展伯爵夫人格雷和hidra答案
在将渐变添加到特定视图时,需要设置渐变层的实际帧。
如果在视图上最初添加了渐变图层的视图确实已加载,那么您必须将其放入,然后它将无法按预期调整大小,可以通过两种方法解决此问题。
第一: 通过计算视图的大小手动给定帧,但这非常麻烦,因为您必须为每个iPhone变型计算,才能计算出宽高比BY。
let bounds = UIScreen.main.bounds
let deviceheight = bounds.size.height
let deviceWidth = bounds.size.width
然后您计算并给出宽度大小
另一种方法是不执行任何计算即可,只需在加载视图后添加图层即可,这可以通过以下方式完成:
override func viewDidAppear(_ animated: Bool) {
Your gradient code //you can create a method for adding a gradient layer
}
现在在Tableview或collection视图中,存在相同的问题,并且在单元格中没有任何视图确实出现过方法。我们有两种情况。
- 数据是静态的。
- 数据来自服务器
在第一种情况下,当数据是静态的时,您都必须创建一个布尔类型的变量并将其设置为false,直到加载视图为止。然后在视图中确实在索引方法中出现了用于行的方法,然后再次重新加载单元格。
class VC: UIViewController {
var isCellLoaded : Bool = false
override func viewDidAppear(_ animated: Bool) {
isCellLoaded = true
self.aTable.reloadData()
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "youcellidentifier", for: indexPath) as! youcell
if isCellLoaded {
cell.gradientView.setGradient(cornerRadius: 5, gradientLeftColor: .notificationViewLeftColor, gradientRightColor: .notificationViewRightColor)
if let gradient = cell.gradientView.layer.sublayers?[0] as? CAGradientLayer {
gradient.frame = cell.gradientView.bounds
}
}
return cell
}
当数据来自API时进入第二种情况
万岁!您不需要做任何事情,因为第一次,直到直到api没有给出任何响应的数据为止,当响应到来时,您必须重新加载数据。一切都会正常进行。 引用