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.
Sie sollten den Inhalt (en) in 'tableview (_: cellForRowAt:)' ändern. Diese Methode von Ihnen ist ein guter Kandidat beim Erstellen von Zellen, nicht beim Auspacken. –
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
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. –