Добавление слоя градиента в представление таблицы

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

let gradientLayer = CAGradientLayer()

gradientLayer.frame = view.bounds

gradientLayer.colors = [UIColor(red: 125/255.0, green: 125/255.0, blue: 125/255.0, alpha: 1.0).cgColor, UIColor(red: 125/255.0, green: 125/255.0, blue: 255/255.0, alpha: 1.0).cgColor]

gradientLayer.startPoint = CGPoint(x: 0.0, y: 0.0)
gradientLayer.endPoint = CGPoint(x: 0.0, y: 1.0)

tableView.layer.addSublayer(gradientLayer)

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

введите описание изображения здесь

Кто-нибудь знает, как это исправить, или как сделать то, что я хочу, по-другому, чтобы это работало?

Любая помощь очень ценится, спасибо.


person D-A UK    schedule 31.12.2017    source источник


Ответы (2)


Создайте фоновое представление и назначьте его TableView:

func setGradientToTableView(tableView: UITableView, _ topColor:UIColor, _ bottomColor:UIColor) {

    let gradientBackgroundColors = [topColor.CGColor, bottomColor.CGColor]
    let gradientLocations = [0.0,1.0]

    let gradientLayer = CAGradientLayer()
    gradientLayer.colors = gradientBackgroundColors
    gradientLayer.locations = gradientLocations

    gradientLayer.frame = tableView.bounds
    let backgroundView = UIView(frame: tableView.bounds)
    backgroundView.layer.insertSublayer(gradientLayer, atIndex: 0)
    tableView.backgroundView = backgroundView
}

Также очистите цвет TableView ячейки:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
    cell.backgroundColor = UIColor.clearColor()
}
person AGM Tazim    schedule 31.12.2017
comment
Я не использую контроллер Tableview. Как бы я это сделал для обычного контроллера представления. - person D-A UK; 31.12.2017
comment
Просто поместите весь код туда, где он был изначально, и удалите sender. перед tableView. - person Upholder Of Truth; 31.12.2017
comment
В Swift 4 это должно быть backgroundView.layer.insertSublayer(gradientLayer, at: 0). Также не забывайте, что если макет tableView изменится (вращение и т. Д.), То слой градиента не будет следовать за ним. Вам нужно будет переопределить viewDidLayoutSubviews и обновить там слой. В противном случае хорошее решение, поэтому проголосуйте за него. - person Upholder Of Truth; 31.12.2017
comment
Градиент работает, но бит четкости нет: imgur.com/a/wy7Kg - person D-A UK; 31.12.2017
comment
Я немного исправил четкий цвет ячеек, но, похоже, на моем физическом iPad Pro возникла проблема. Как это исправить: imgur.com/a/1FRPn - person D-A UK; 31.12.2017
comment
Может быть проблема в его ограничении. правильно поставить ограничения. - person AGM Tazim; 31.12.2017
comment
Если вы используете Swift 4, это должно быть cell.backgroundColor = .clear . Вы можете поместить это в willDisplayCell, как в ответе, или в свой фактический подкласс UITableViewCell, если вы его используете, или в метод cellForRowAt. - person Upholder Of Truth; 31.12.2017
comment
@AGMTazim, это не проблема ограничений, потому что размер градиентного слоя зависит от того, какое устройство я выбрал в раскадровке при запуске проекта. Это тоже зависит от ориентации. Как это исправить? - person D-A UK; 31.12.2017
comment
Как я сказал ранее, это связано с тем, что рамка слоя градиента устанавливается только один раз, и поэтому, если макет представления таблицы изменяется, слой градиента не изменяется. Чтобы исправить это, вам нужно переместить определение backgroundView в переменную экземпляра класса, затем переопределить viewDidLayoutSubviews и добавить эту строку backgroundView.layer.sublayers![0].frame = tableView.bounds. Таким образом, при изменении макета будет обновлена ​​и рамка слоя градиента. - person Upholder Of Truth; 31.12.2017
comment
попробуйте изменить let backgroundView = UIView(frame: tableView.bounds) на let backgroundView = UIView(frame: tableView.frame). и дайте мне знать, что происходит. - person AGM Tazim; 31.12.2017
comment
Или вы можете попробовать с let backgroundView = UIView(frame: view.frame) - person AGM Tazim; 31.12.2017
comment
Ни один из этих способов не решит проблему. Проблема заключается не в фрейме backgroundView, поскольку он остается таким же, как и в табличном представлении, поскольку является фоном табличных представлений. Проблема в том, что кадр gradientLayer никогда не обновляется, поэтому вам нужно исправить это в viewDidLayoutSubviews. - person Upholder Of Truth; 31.12.2017

@AGM Tazim

Спасибо за этот фрагмент кода. Я немного изменил его, чтобы учесть обновленный язык Swift для cGColor, и указал начальную и конечную точки градиента.

Надеюсь, это поможет всем, кто хочет сделать его более настраиваемым.

    func setGradientToTableView(tableView: UITableView, _ topColor:UIColor, _ bottomColor:UIColor) {

    let gradientBackgroundColors = [topColor.cgColor, bottomColor.cgColor]


    let gradientLayer = CAGradientLayer()
    gradientLayer.colors = gradientBackgroundColors
    gradientLayer.locations = [0.0,1.0]
    gradientLayer.startPoint = CGPoint(x: 0, y: 0)
    gradientLayer.endPoint = CGPoint(x: 0, y: 1)
    gradientLayer.frame = tableView.bounds
    let backgroundView = UIView(frame: tableView.bounds)
    backgroundView.layer.insertSublayer(gradientLayer, at: 0)
    tableView.backgroundView = backgroundView
}
person ivan ramirez    schedule 09.01.2019