2014-09-25 17 views
14

Ich habe eine UITableViewCell mit Einschränkungen, so dass die Zellen Layout korrekt auf iPhone 6 und iPhone 6 +.UITableViewCell watchFromNib falsche Bildgröße

Der Zelleninhalt wird korrekt korrekt skaliert. Allerdings muss ich einen Teilschichtgradienten über eine der Ansichten im Inneren zeichnen. Um dies zu tun, verwende ich watchFromNib, um den Sublayer zu zeichnen.

AwakeFromNib gibt die Größe des Frames vor der Autoresierung an und daher ist die Gradient Subview nicht die richtige Größe.

Wenn ich layoutSubviews verwende, ist das erste Mal, wenn es aufgerufen wird, auch die Größe falsch und die Zelle muss gescrollt werden, bevor sie die richtige Größe hat; damit diese Methode auch nicht funktioniert

Welche Methode sollte ich verwenden, um die richtige Bildgröße zu erhalten, um richtig zu zeichnen?

Antwort

21

Dieser Code arbeitete für mich, ist in Swift geschrieben.

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

während wakeFromNib werden die Rahmenlayouts nicht angezeigt. Auf Ihrer benutzerdefinierten Zelle können Sie entweder tun, um diese

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

Oder Sie können Methode wie folgt

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

} 

applyLayoutAttributes außer Kraft setzen applyLayoutAttributes vor drawRect Methode aufgerufen wird, aber immer noch die Größe parameteres von rect hat.

+1

applyLayoutAttributes scheint nur für collectionCells zu funktionieren. Für meine UITableViewCell habe ich deine drawRect benutzt: antwort - danke! – amergin

+0

Das funktionierte für mich, aber das Überschreiben von drawRect reduziert normalerweise die Leistung, richtig? –

3

@angshuk Antwort ist perfekt, wenn jemand die Benutzeroberfläche in UITableViewCell ändern möchte. Wie in meinem Fall habe ich versucht, eine andere Ebene auf der Laufzeit zu einer UIView hinzuzufügen, die mit Storyboard/Autolayout in UITableViewCell platziert wurde. Versucht die gleiche Sache innerhalb awakeFromNib() & layoutSubviews() auch. Nichts hat geklappt.

Hier ist der gleiche Code mit Swift. Übrigens verwende ich Xcode 7.3.1 mit 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 
} 

Hoffe das half. Vielen Dank.

+0

Das funktionierte für mich, aber Overriding DrawRect reduziert normalerweise die Leistung richtig? –