2014-09-25 2 views
14

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

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

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

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

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

ответ

21

Этот код работал для меня, написан в 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 
    } 
} 
13

во время 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, но все еще имеете parameteres размерного прямоугольника.

+1

applyLayoutAttributes, по-видимому, работает только для коллекцииCells. Для моего UITableViewCell я использовал ваш drawRect: ответ - спасибо! – amergin

+0

Это сработало для меня, но переопределение drawRect обычно снижает производительность? – 2017-09-25 05:00:25

3

Ответ @angshuk идеально подходит, если кто-то хочет изменить пользовательский интерфейс внутри 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 
} 

Надеюсь, это помогло. Благодарю.

+0

Это сработало для меня, но переопределение drawRect обычно снижает производительность? – 2017-09-25 05:00:30

Смежные вопросы