UITableViewCell awakeFromNib неправильный размер кадра

У меня есть UITableViewCell с ограничениями, чтобы ячеек правильно размещался на iPhone 6 и iPhone 6 +.

Содержимое ячейки правильно изменяет размер. Однако мне нужно нарисовать градиент подуровня над одним из видов внутри. Для этого я использую awakeFromNib для рисования подслоя.

AwakeFromNib задает размер кадра перед его авторезистированием, и поэтому subview под градиентом не является правильным размером.

Если я использую layoutSubviews, первый раз, когда он вызывал, размер также неверен, и ячейка должна быть прокручена до того, как она будет иметь нужный размер; так что этот метод также не работает

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

Ответы

Ответ 1

Этот код работал у меня, написан в Swift.

import UIKit
import QuartzCore

class DemoTableViewCell: UITableViewCell {
    @IBOutlet weak var gradientView: UIView!

    private let gl = CAGradientLayer()

    override func awakeFromNib() {
        super.awakeFromNib()

        // set gradient
        let colors: [AnyObject] = [
            UIColor.clearColor().CGColor,
            UIColor(white: 0, alpha: 0.8).CGColor
        ]
        gl.colors = colors
        gradientView.layer.insertSublayer(gl, atIndex: 0)
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        // update gradient
        gl.frame = gradientView.bounds
    }
}

Ответ 2

во время awakeFromNib макеты фрейма не отображаются. В своей пользовательской ячейке вы можете либо сделать это

-(void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    // Enter Custom Code
}

Или вы можете переопределить метод applyLayoutAttributes, подобный этому

-(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes
{
    [super applyLayoutAttributes:layoutAttributes];
    // Enter custom Code here

}

applyLayoutAttributes вызывается перед методом drawRect, но все еще имеет параметры размера rect.

Ответ 3

Ответ @angshuk идеально подходит, если кто-то хочет изменить UI внутри UITableViewCell. Как и в моем случае, я пытался добавить другой слой во время выполнения в UIView, размещенный внутри UITableViewCell, используя раскадровку/автозапуск. Пробовал то же самое внутри awakeFromNib() и layoutSubviews(). Ничего не получилось.

Вот тот же код с помощью Swift. Кстати, я использую Xcode 7.3.1 с Swift 2.2.

import UIKit

class InviteMainCellClass: UITableViewCell {

@IBOutlet weak var shareCodeLblSuperView: UIView!  //Custom view added using IB/Autolayout

override func awakeFromNib() {
    super.awakeFromNib()
    //shareCodeLblSuperView.addDashedBorderToView(self.shareCodeLblSuperView, viewBorderColor: UIColor.whiteColor(), borderWidth: 1.0) //Not worked
}

override func drawRect(rect: CGRect) {
    super.drawRect(rect)
    shareCodeLblSuperView.addDashedBorderToView(self.shareCodeLblSuperView, viewBorderColor: UIColor.whiteColor(), borderWidth: 1.0) //Worked
}



override func layoutSubviews() {
    super.layoutSubviews()
    //shareCodeLblSuperView.addDashedBorderToView(self.shareCodeLblSuperView, viewBorderColor: UIColor.whiteColor(), borderWidth: 1.0)//Not worked
}

Надеюсь, это помогло. Спасибо.