GradientLayer перекрывает метку ячейки в Swift? - PullRequest
0 голосов
/ 04 мая 2018

Я хочу изменить фон метки ячейки на градиент, а текст метки - на белый. Изображение ниже представляет собой tableView, и метка ячейки перекрывается, как показано.

enter image description here

Вот мои коды ниже

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
  let cell = self.tableView.dequeueReusableCell(
            withIdentifier: "tableViewCell",
            for: indexPath) as! CustomTableViewCell
  let bubbleGradient: CAGradientLayer = CAGradientLayer()

  let colorTop = UIColor(red:0.08, green:0.12, blue:0.19, alpha:1.0).cgColor
  let colorBottom = UIColor(red:0.14, green:0.23, blue:0.33, alpha:1.0).cgColor

  bubbleGradient.colors = [colorTop, colorBottom]
  bubbleGradient.startPoint = CGPoint(x: 0.0, y: 0.5)
  bubbleGradient.endPoint = CGPoint(x: 1.0, y: 0.5)

  bubbleGradient.frame = cell.text.bounds
  bubbleGradient.cornerRadius = 10
  cell.text.layer.addSublayer(bubbleGradient)
  cell.text?.text = text as? String

  return cell
}

Но GradientLayer накладывается на ярлык моей ячейки. Как мне это исправить?

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Как вы знаете, мы повторно используем ячейку. В своем коде вы добавляете слой в поле зрения, не удаляя первый слой. Что создает проблему.

    if cell.textLabel?.layer.sublayers == nil {

        let bubbleGradient: CAGradientLayer = CAGradientLayer()
        let colorTop = UIColor(red:0.08, green:0.12, blue:0.19, alpha:1.0).cgColor
        let colorBottom = UIColor(red:0.14, green:0.23, blue:0.33, alpha:1.0).cgColor

        bubbleGradient.colors = [colorTop, colorBottom]
        bubbleGradient.startPoint = CGPoint(x: 0.0, y: 0.5)
        bubbleGradient.endPoint = CGPoint(x: 1.0, y: 0.5)

        bubbleGradient.frame = (cell.text?.bounds)!
        bubbleGradient.cornerRadius = 10
        cell.text?.layer.addSublayer(bubbleGradient)
    }

Попробуйте это в вашем cellForRow методе.

0 голосов
/ 04 мая 2018

Когда вы вставляете подслой в UILabel, он скрывает текст метки. Итак, добавьте UIlabel в UIView и примените градиент к слою UIView. Проверьте ниже код:

let bubbleGradient: CAGradientLayer = CAGradientLayer()

let colorTop = UIColor(red:0.08, green:0.12, blue:0.19, alpha:1.0).cgColor
let colorBottom = UIColor(red:0.14, green:0.23, blue:0.33, alpha:1.0).cgColor

bubbleGradient.colors = [colorTop, colorBottom]
bubbleGradient.startPoint = CGPoint(x: 0.0, y: 0.5)
bubbleGradient.endPoint = CGPoint(x: 1.0, y: 0.5)

bubbleGradient.frame = label.bounds
label.backgroundColor = UIColor.clear
let viewLabel = UIView.init(frame: label.frame)
self.view.addSubview(viewLabel)
viewLabel.backgroundColor = UIColor.clear
viewLabel.addSubview(label)
bubbleGradient.cornerRadius = 10
viewLabel.layer.insertSublayer(bubbleGradient, at: 0)

enter image description here

...