CAGradientLayer UIView в TableView не изменяет размер до Autolayout

Я создал UIView в IB с тегом: 6. Я использую его в tableView.

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell

    // create background view
    var backgroundView =  cell.contentView.viewWithTag(6) as UIView!
    backgroundView.layer.cornerRadius = 10
    backgroundView.layer.masksToBounds = true

    // create gradient layer
    let gradient : CAGradientLayer = CAGradientLayer()

    // create color array
    let arrayColors: [AnyObject] = [
        UIColor (red: 33/255, green: 33/255, blue: 39/255, alpha: 1).CGColor,
        UIColor (red: 24/255, green: 24/255, blue: 28/255, alpha: 1).CGColor]

    // set gradient frame bounds to match view bounds
    gradient.frame = backgroundView.bounds

    // set gradient's color array
    gradient.colors = arrayColors

    gradient.startPoint = CGPoint(x: 0.0, y: 0.0)
    gradient.locations = [0.1, 0.9]
    gradient.endPoint = CGPoint(x: 1, y: 1)

    // replace base layer with gradient layer
    backgroundView.layer.insertSublayer(gradient, atIndex: 0)

Проблема в том, что в то время как backgroundView изменяет размер на Autolayout, слой градиента не изменяется, как я и ожидал:

    gradient.frame = backgroundView.bounds

Я не смог найти никаких ответов, применимых к UIViews в ячейке TableView.

Вопрос: Каков правильный код, чтобы принудительно изменить размер слоя, примененного к UIView в TableView, с помощью автомакета?


person KML    schedule 05.02.2015    source источник


Ответы (2)


Я думаю, вы можете попытаться создать подкласс UITableViewCell, а затем сделать CAGradientLayer слоем по умолчанию.

Тогда его размер должен соответствовать его эквивалентному виду, хотя я не проверял это.

person Wan Lutfi Wan Hatta    schedule 18.02.2015
comment
Обратите внимание, что ячейка табличного представления имеет существующую иерархию фонового представления, выбранного фонового представления, фонового представления с множественным выбором и представления содержимого. Дважды подумайте, прежде чем вносить изменения в его виды и слои. - person David Rönnqvist; 01.04.2015

Это ответ, который вы ищете: https://stackoverflow.com/a/4111917/2831015

Подкласс UIView и используйте его как ваш «backgroundView». Переопределив класс слоя на CAGradientLayer, вам не нужно добавлять градиент в качестве подслоя, и такой градиент будет автоматически изменяться в зависимости от родителя.

person Dover8    schedule 01.04.2015
comment
Спасибо, это еще одна реализация в Swift пользовательского UIView для достижения автоматического изменения размера: autolayout">stackoverflow.com/questions/29111099/ - person KML; 01.04.2015
comment
@karlml Я пытался использовать layoutSublayersOfLayer, который изменял размер градиента, но этого не происходило во время вращения устройства (когда мне нужно было его пересчитать) и всегда отставал на одну фазу. - person Dover8; 02.04.2015
comment
Что ж, используйте решение, на которое я ссылался, я знаю, что оно работает так же, как и в моем текущем приложении ;-) - person KML; 02.04.2015
comment
Если у вас возникнут трудности, дайте мне знать, и я объясню - person KML; 02.04.2015