2014-09-25 21 views
14

Ho un UITableViewCell con vincoli in modo che il layout delle celle sia corretto su iPhone 6 e iPhone 6+.UITableViewCell awakeFromNib dimensione frame errata

Il contenuto della cella viene ridimensionato correttamente correttamente. Tuttavia, ho bisogno di disegnare una sfumatura sublayer su una delle viste al suo interno. Per fare ciò, sto usando awakeFromNib per disegnare il sottolivello.

AwakeFromNib sta dando la dimensione del frame prima che si autorizza e quindi la vista secondaria sfumatura non è la giusta dimensione.

Se utilizzo layoutsubviews, la prima volta che viene chiamato, la dimensione è anch'essa errata e la cella deve essere scorsa prima che abbia le dimensioni corrette; in modo che anche il metodo non funzioni

Quale metodo dovrei utilizzare per ottenere le giuste dimensioni del fotogramma per disegnare correttamente?

risposta

21

Questo codice ha funzionato per me, è scritto in 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

durante awakeFromNib non vengono visualizzati i layout dei frame. Sul tuo cellulare personalizzato è possibile fare questo

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

Oppure si può ignorare applyLayoutAttributes metodo come questo

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

} 

applyLayoutAttributes viene chiamato prima il metodo drawRect ma ha ancora le dimensioni parameteres di rett.

+1

applyLayoutAttributes sembra funzionare solo per collectionCells. Per il mio UITableViewCell ho usato il tuo drawRect: risposta - grazie! – amergin

+0

Questo ha funzionato per me, ma sovrascrivere drawRect di solito riduce le prestazioni giusto? –

3

@angshuk answer è perfetto dove se qualcuno vuole modificare l'interfaccia utente all'interno di UITableViewCell. Come nel mio caso, stavo cercando di aggiungere un layer diverso in runtime a un UIView, collocato all'interno di UITableViewCell usando storyboard/autolayout. Ho provato la stessa cosa all'interno di awakeFromNib() & layoutSubviews() anche. Niente ha funzionato

Ecco lo stesso codice utilizzando Swift. Dal modo in cui sto usando Xcode 7.3.1 con 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 
} 

Spero che questo ha aiutato. Grazie.

+0

Questo ha funzionato per me, ma sovrascrivere drawRect di solito riduce le prestazioni giusto? –

Problemi correlati