Swift Table View Cell меняет цвет градиента после прокрутки - PullRequest
0 голосов
/ 04 марта 2019

Я только что понял, что мое табличное представление работает неправильно после проверки моего приложения на нескольких устройствах.В настоящее время я работаю над представлением, которое содержит представление прокрутки вверху и представление таблицы внизу.

Когда я создавал View, я работал с Iphone XS Max в качестве тестового устройства, и все работало нормально.Однако, когда устройство становится меньше, табличное представление начинает делать странные вещи.

Вот как я хочу, чтобы табличное представление выглядело:

Табличное представление на Iphone XS Max

На меньших устройствах цвет фона последней ячейки табличного представления не зеленый (какой он должен быть в соответствии с кодом), вместо этого он имеет тот же цвет, что и первая ячейка.

КогдаЯ прокручиваю назад до вершины, первая ячейка имеет цвет, который должна иметь последняя ячейка в соответствии с моим кодом

Вот мой cellForRowAt IndexPath

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "GruppenCell", for: indexPath) as! GroupCell
    cell.bgView.backgroundColor = nil
    cell.bgView.layer.cornerRadius = 10
    cell.bgView.clipsToBounds = true
    cell.selectionStyle = .none

    if(indexPath.row == 0) {
        cell.bgView.setGradientBackground(colorOne: UIColor.white
            , colorTwo: KitaGruppen.Spatzen().color, bounds_object: cell.bgView)
        cell.groupLabel!.text = "Spatzen"
        cell.iconImageView?.image = UIImage(named: "SpatzIcon")
    }

    else if(indexPath.row ==  1) {
        cell.bgView.setGradientBackground(colorOne: UIColor.white
            , colorTwo: KitaGruppen.Elefanten().color, bounds_object: cell.bgView)
        cell.groupLabel!.text = "Elefanten"
        cell.iconImageView?.image = UIImage(named: "elefantIcon")
    }

    else if(indexPath.row == 2) { 
        cell.bgView.setGradientBackground(colorOne: UIColor.white
            , colorTwo: KitaGruppen.Mäuse().color, bounds_object: cell.bgView)
        cell.groupLabel!.text = "Mäuse"
        cell.iconImageView?.image = UIImage(named: "mouseIcon")
    }

    else if(indexPath.row == 3) {
        cell.bgView.setGradientBackground(colorOne: UIColor.lightGray
            , colorTwo: KitaGruppen.Pferde().color, bounds_object: cell.bgView)
        cell.groupLabel!.text = "Pferde"
        cell.iconImageView?.image = UIImage(named: "horseIcon")
        print("Ich bin der Pferd Index")
    }

    else if(indexPath.row == 4) {
        cell.bgView.setGradientBackground(colorOne: UIColor.lightGray
            , colorTwo: KitaGruppen.Frösche().color, bounds_object: cell.bgView)
        cell.groupLabel!.text = "Frösche"
        cell.iconImageView?.image = UIImage(named: "FrogIcon")
    }
    else {
        cell.bgView.setGradientBackground(colorOne: UIColor.lightGray
            , colorTwo: UIColor.white, bounds_object: cell.bgView)
    }

    return cell
}

Вот мой Struct для цветов

struct KitaGruppen {

struct Spatzen{
    var name = "Spatzen"
    var name_lower = "spatzen"
    var color = #colorLiteral(red: 1, green: 0.871347487, blue: 0, alpha: 1)    
}

struct Elefanten{
    var name = "Elefanten"
    var name_lower = "Elefanten"
    var color = #colorLiteral(red: 0, green: 0.3798098862, blue: 1, alpha: 1)

}

struct Pferde{  
    var name = "Pferde"
    var name_lower = "pferde"
    var color = #colorLiteral(red: 1, green: 0, blue: 0, alpha: 1)
}

struct Frösche{
    var name = "Frösche"
    var name_lower = "frösche"
    var color = #colorLiteral(red: 0.5412063003, green: 0.9987080693, blue: 0.2685243189, alpha: 1)
}

struct Mäuse{
    var name = "Mäuse"
    var name_lower = "Mäuse"
    let color = #colorLiteral(red: 0.9411764741, green: 0.4980392158, blue: 0.3529411852, alpha: 1)
}
}

Вот мой класс ячеек

class GroupCell: UITableViewCell {

override func prepareForReuse() {
    super.prepareForReuse()

    self.iconImageView.image = nil
    self.groupLabel.text = ""

    self.bgView.setGradientBackground(colorOne: UIColor.white
        , colorTwo: KitaGruppen.Spatzen().color, bounds_object: self.bgView)
}

Я добавил метод prepareForReuse, чтобы исправить эту ошибку, но он не оказал никакого влияния.

Я не знаю, еслиэто важно, но вот мой метод setGradientBackground:

    func setGradientBackground(colorOne: UIColor, colorTwo: UIColor, bounds_object: UIView){

    let gradientLayer = CAGradientLayer()
    gradientLayer.frame = bounds_object.bounds
    gradientLayer.colors = [colorOne.cgColor, colorTwo.cgColor]
    gradientLayer.locations = [0.0, 1.0]
    gradientLayer.startPoint = CGPoint(x: 1.0, y: 1.0)
    gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.0)

    layer.insertSublayer(gradientLayer, at: 0)
}

Странно то, что единственными данными в ячейках, которые имеют эту ошибку, является цвет градиента.Текст для текстовой метки, а также значки вообще не перепутываются.

Кто-нибудь знает какое-нибудь решение для этого?

Спасибо за помощь!

1 Ответ

0 голосов
/ 04 марта 2019

Проблема может быть вызвана тем фактом, что новый градиентный слой вставляется каждый раз, когда вызывается setGradientBackground.

Чтобы избежать этой проверки, существует ли слой.Если он существует, обновите цвета, в противном случае создайте новый слой.

func setGradientBackground(colorOne: UIColor, colorTwo: UIColor, bounds_object: UIView){

    if let gradientLayer = layer.sublayers?.first as? CAGradientLayer {
        gradientLayer.colors = [colorOne.cgColor, colorTwo.cgColor]
    } else {
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = bounds_object.bounds
        gradientLayer.colors = [colorOne.cgColor, colorTwo.cgColor]
        gradientLayer.locations = [0.0, 1.0]
        gradientLayer.startPoint = CGPoint(x: 1.0, y: 1.0)
        gradientLayer.endPoint = CGPoint(x: 0.0, y: 0.0)
        layer.insertSublayer(gradientLayer, at: 0)
    }
}

На самом деле prepareForReuse() является избыточным, поскольку вы можете установить изображение и текст в последней области действия else.Он гарантирует, что все элементы пользовательского интерфейса установлены в определенное состояние.

Добавьте эти две строки и удалите весь метод prepareForReuse() в GroupCell.

else {
    cell.bgView.setGradientBackground(colorOne: UIColor.lightGray
        , colorTwo: UIColor.white, bounds_object: cell.bgView)
    cell.iconImageView.image = nil
    cell.groupLabel.text = ""
}

Лучший синтаксис, чемif - else if в данном случае это switch

switch indexPath.row {
case 0: 
    cell.bgView.setGradientBackground(colorOne: UIColor.white
        , colorTwo: KitaGruppen.Spatzen().color, bounds_object: cell.bgView)
    cell.groupLabel!.text = "Spatzen"
    cell.iconImageView?.image = UIImage(named: "SpatzIcon")

case 1:

    cell.bgView.setGradientBackground(colorOne: UIColor.white
        , colorTwo: KitaGruppen.Elefanten().color, bounds_object: cell.bgView)
    cell.groupLabel!.text = "Elefanten"
    cell.iconImageView?.image = UIImage(named: "elefantIcon")

...

default: 
    cell.bgView.setGradientBackground(colorOne: UIColor.lightGray
        , colorTwo: UIColor.white, bounds_object: cell.bgView)
    cell.iconImageView.image = nil
    cell.groupLabel.text = ""
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...