У меня проблема с плавной прокруткой на моем UITableViewCell
.Когда я медленно прокручиваю UITableView
, я получаю 30-40 FPS, и мои ячейки прыгают (сначала сверху, а затем снизу).
Когда я быстро прокручиваю, я получаю 55-60 FPS, клетки не 'прыгаю и все хорошо.
FPS был измерен с помощью профиля.
Также, когда я прокручиваю, загрузка процессора составляет ~ 15-25%
Я использую UIStoryboard
для создания ячейки, Realm DB
и UITableViewAutomaticDimension
Вот мой UITableView
Код:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let stop = getStop(indexPath: indexPath)
let cell = tableView.dequeueReusableCell(withIdentifier: "stop", for: indexPath) as! StopTableViewCell
cell.configure(model: stop)
return cell
}
Вот код клетки:
class StopTableViewCell: UITableViewCell {
@IBOutlet weak var status: UILabel!
@IBOutlet weak var number: UILabel!
@IBOutlet weak var date: UILabel!
@IBOutlet weak var name: UnderLinedLabel!
@IBOutlet weak var address: UnderLinedLabel!
@IBOutlet weak var phone: UnderLinedLabel!
@IBOutlet weak var milage: UILabel!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
override func prepareForReuse() {
super.prepareForReuse()
name.text = nil
address.text = nil
phone.text = nil
milage.text = nil
number.text = nil
date.text = nil
}
func calculateEstimateRoute(to lat: Double, lon: Double) -> String {
let distance = LocationManager.Instance.actualLocation.distance(from: CLLocation(latitude: lat, longitude: lon))
let isMetric = NSLocale.current.usesMetricSystem
let measurment = Measurement(value: distance, unit: UnitLength.meters)
var estimateRoute = !isMetric ? measurment.converted(to: UnitLength.miles) : measurment.converted(to: UnitLength.kilometers)
estimateRoute.value = round(estimateRoute.value)
return "~" + String(describing: estimateRoute)
}
func configure<T>(model: T) {
if let stop = model as? Stop {
name.text = stop.name
address.text = stop.address1 + "\n" + stop.address2
phone.text = stop.phone
phone.isHidden = stop.phone.isEmpty
milage.text = calculateEstimateRoute(to: stop.lat, lon: stop.lng)
number.text = "# " + stop.refno
date.text = stop.departtime
layer.shouldRasterize = true
layer.rasterizationScale = UIScreen.main.scale
}
}
}
Вот ячейка с помощью раскадровки:
Может быть, я должен создать 3 ячейки: одну для верхнего OrangeView, вторую для центрального содержимого и третью из нижних кнопок?
Здесьэто:
func getStop<S: Stop>(indexPath: IndexPath) -> S {
switch segmentIndex {
case 0:
return stops.ASSIGNED[indexPath.row] as! S
case 1:
return stops.UNASSIGNED[indexPath.row] as! S
default:
return Stop() as! S
}
}
В шапке у меня есть UISegmentedControl