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
}
Надеюсь, это помогло. Спасибо.