2017-07-17 2 views
0

Ich habe eine UITableView in einem UIView, und es besteht aus benutzerdefinierten Zellen durch die folgende Klasse definiert gemacht:Laggy UITableView Scrollen wegen CAShapeLayer (Swift 3)

class CustomAddFriendTableViewCell: UITableViewCell { 
    @IBOutlet weak var UsernameLbl: UILabel! 
    @IBOutlet weak var ProfileImg: UIImageView! 
    @IBOutlet weak var AddFriendBtn: UIButton! 
} 

Innerhalb des tableview(_:cellForRowAt:) Methode des Viewcontroller ich den Anruf folgende Funktion der Zelle ProfileImg Layout:

private func layoutProfilePics(with cell:CustomAddFriendTableViewCell) { 
    //create gradient 
    let gradient = CAGradientLayer() 
    gradient.frame = CGRect(origin: CGPoint.zero, size: cell.ProfileImg.frame.size) 
    gradient.colors = [Colors.blueGreen.cgColor, Colors.yellow.cgColor] 

    //create gradient mask 
    let shape = CAShapeLayer() 
    shape.lineWidth = 3 
    shape.path = UIBezierPath(ovalIn: cell.ProfileImg.bounds).cgPath // commenting this out makes lag go away 
    shape.strokeColor = UIColor.black.cgColor // commenting this out makes lag go away 
    shape.fillColor = UIColor.clear.cgColor 
    gradient.mask = shape 

    cell.ProfileImg.layoutIfNeeded() 
    cell.ProfileImg.clipsToBounds = true 
    cell.ProfileImg.layer.masksToBounds = true 
    cell.ProfileImg.layer.cornerRadius = cell.ProfileImg.bounds.size.width/2.0 
    cell.ProfileImg.layer.addSublayer(gradient) 

} 

Dieser Code verursacht ProfileImg ein Kreis zu sein und eine gemeinsame Grenze mit einem blau-grünen Farbverlauf haben. Die zwei Zeilen mit Kommentaren neben ihnen machen das Scrollen sehr glatt (dh der Gradient ist nicht das, was die Verzögerung verursacht), also nehme ich an, dass das Rendering des CAShapeLayer (speziell des Strokes) das Problem verursacht (daher der Fragetitel). Was kann ich tun, um die Scrollleistung des Tableview zu verbessern?

Ich bin mir auch nicht sicher, ob dies ein XCode-Bug ist oder ob er etwas mit meinem Problem zu tun hat, aber im Fenster des Projektnavigators, wenn ich die App lauere und die UITableView-Ansicht durchschaue, funktioniert der FPS nicht spiegeln die Verzögerung wider, auch wenn ich klar sagen kann, dass es sehr verzögert ist. In der Tat gibt es keine merklichen Unterschiede in irgendeiner der Komponenten in dem Fenster (CPU, Speicher, Energieauswirkung, etc.).

Update:

ich bewegen versucht, die layoutProfilePics(with:) Funktion in der CustomAddFriendTableViewCell ‚s prepareForReuse() Funktion und ich habe auch versucht, layoutProfilePics(with:) in seiner layoutSubviews() Funktion setzen, aber keiner von ihnen das Scrollen verbessert.

+0

Sie sollten den Inhalt (en) in 'tableview (_: cellForRowAt:)' ändern. Diese Methode von Ihnen ist ein guter Kandidat beim Erstellen von Zellen, nicht beim Auspacken. –

+0

Ich habe versucht, die Funktion in die 'layoutSubviews()' -Funktion der Klasse der benutzerdefinierten Zelle zu verschieben und auch versucht, sie in die 'prepareForReuse()' -Funktion der Klasse der Klasse zu verschieben, aber die Scroll-Performance der Tabelle wurde nicht verbessert. – RPatel99

+2

Haben Sie sichergestellt, dass Sie diese Layer nur einmal zu jeder Zelle hinzufügen? Denken Sie daran, dass Zellen wiederverwendet werden und dass alle Ebenen, die Sie der Zelle bei der ersten Verwendung hinzufügen, immer noch vorhanden sind, wenn Sie sie erneut verwenden, sofern Sie sie nicht entfernen. –

Antwort

1

Dieser Code soll einmal für jede Zelle aufgerufen werden und darf deshalb nicht in tableView(_:cellForRowAt:) aufgerufen werden. Versuchen Sie, dass Code zu awakeFromNib() bewegen und wenn Sie eine Spitze für die benutzerdefinierte Zelle, verwenden Sie den folgenden Code in viewDidLoad() die die Ausgänge zu laden:

let addFriendCellNib = UINib(nibName: "CustomAddFriendTableViewCell", bundle: nil) 
tableView.register(addFriendCellNib, forCellReuseIdentifier: "addFriendCell") 

Ich hoffe, dass für Sie arbeitet.

+0

Das funktioniert. Vielen Dank! Wissen Sie auch, warum die Instrumente keine Daten zeigten, die Sie normalerweise sehen, wenn es Lag gibt? – RPatel99

+0

Nicht sicher, welche Daten Sie beziehen. Die Verzögerung war darauf zurückzuführen, dass Ihre Benutzeroberfläche beim Scrollen erheblich vergrößert wurde. Hinzufügen eines Layers jedes Mal, wenn eine Zelle aus der Warteschlange genommen wird. –

+0

Die Daten, die ich verweise, sind die CPU-Leistung, FPS, Speicher usw., die auf der 6. Registerkarte im Projektnavigatorbereich in XCode sind. Und was meinst du mit beträchtlichen? – RPatel99

Verwandte Themen