Превъртането на Tableview е малко нервно. Как мога да го направя маслено гладко

Ето моя код в клетка за метод на ред: -

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeue(.journalListingCell, for: indexPath) as! JournalListViewCell
    cell.delegate = self
    //fetching the category model as per the category id 
    if let category = categories?.first(where: { $0.categoryID == dreamJournalArray[indexPath.row].categoryID }) {

        cell.configureCell(dreamJournalArray[indexPath.row], category)
    }

    return cell
}

Този код просто съпоставя идентификатор на категория от масив от категории с идентификатора на категория в основния модел на данни и предава тази категория към модела на клетка за конфигуриране заедно с модела на данни.

Методът за конфигуриране на клетка е както следва:-

 typealias Model = DreamJournalModel
 func configureCell(_ model: Model, _ category: CategoryModel) {

    //setting the gradient colors
    verticalView.backgroundColor = category.categoryGradientColor(style: .topToBottom, frame: verticalView.frame, colors: [UIColor.init(hexString: category.initialGradientColor)!,  UIColor.init(hexString: category.lastGradientColor)!])
    horizontalVIew.backgroundColor = category.categoryGradientColor(style: .leftToRight, frame: self.frame, colors: [ UIColor.init(hexString: category.lastGradientColor)!, UIColor.init(hexString: category.initialGradientColor)!])
    timelineCircleView.backgroundColor = category.categoryGradientColor(style: .topToBottom, frame: timelineCircleView.frame, colors: [UIColor.init(hexString: category.initialGradientColor)!,  UIColor.init(hexString: category.lastGradientColor)!])

    // setting the intention matching image as per the rating
   intentionImageView.image = UIImage.init(named: "Match\(model.intentionMatchRating)")

    // setting up the date of the journal recorded
   let date = Date(unixTimestamp: model.createdAt!)
    dateMonthLabel.text = (date.monthName(ofStyle: .threeLetters)).uppercased()
    dateNumberLabel.text = String(date.day)

    //setting the titles and labels
    dreamTitleLabel.text = model.title
    dreamTagsLabel.text = model.tags

    // setting the lucid icon
    gotLucidImageview.isHidden = !(model.isLucid!)

    //setting the buttons text or image
    if model.recordingPath != nil {
        addRecordButton.setTitle(nil, for: .normal)
        addRecordButton.backgroundColor = UIColor.clear
        addRecordButton.layer.cornerRadius = 0
        addRecordButton.setImage(LRAsset.cardRecording.image, for: .normal)

    }
    else{
        addRecordButton.setTitle(" + RECORD ", for: .normal)
        addRecordButton.backgroundColor = UIColor.blackColorWithOpacity()
        addRecordButton.layer.cornerRadius = addRecordButton.bounds.height/2
        addRecordButton.setImage(nil, for: .normal)

    }

    if model.note != nil {
        addNoteButton.setTitle(nil, for: .normal)
        addNoteButton.backgroundColor = UIColor.clear
        addNoteButton.layer.cornerRadius = 0
        addNoteButton.setImage(LRAsset.cardNote.image, for: .normal)

    }
    else{
        addNoteButton.setTitle(" + NOTE ", for: .normal)
        addNoteButton.backgroundColor = UIColor.blackColorWithOpacity()
        addNoteButton.layer.cornerRadius = addRecordButton.bounds.height/2
        addNoteButton.setImage(nil, for: .normal)

    }

    if model.sketchPath != nil {
        addSketchButton.setTitle(nil, for: .normal)
        addSketchButton.backgroundColor = UIColor.clear
        addSketchButton.layer.cornerRadius = 0
        addSketchButton.setImage(LRAsset.CardSketch.image, for: .normal)
    }
    else{
        addSketchButton.setTitle(" + SKETCH ", for: .normal)
        addSketchButton.backgroundColor = UIColor.blackColorWithOpacity()
        addSketchButton.layer.cornerRadius = addSketchButton.bounds.height/2
        addSketchButton.setImage(nil, for: .normal)

    }
}

В този метод аз задавам градиентните цветове в клетката според категорията. И след това настройвам състоянията на бутоните в долната част според споменатите условия.

Ето как изглежда моят табличен изглед:- въведете описание на изображението тук

3-те бутона в долната част на клетката са в Stackview и външният им вид се променя динамично според условията.

Изгледът на масата не се превърта гладко и забавянето е много видимо с невъоръжено око. Височината на клетката е фиксирана на 205,0 и е дефинирана във височината за метода на индекса на реда. Не знам къде е грешка при извличането и подаването на данните към клетъчната логика. Моля, насочете дали превъртането може да се подобри тук. Благодаря предварително.


person Shikhar varshney    schedule 08.07.2018    source източник
comment
Коментирайте градиента, проверете дали е по-бърз. Коментирайте и датата, ако използвате (NS)DateFormatter, надявам се, че винаги е една и съща и не сте alloc/init всеки път. Освен това избягвайте евентуално филтриране всеки път на категорията и се опитайте да имате модел, който го има директно според категорийния идентификатор, който искате (тествайте го, като давате всеки път този в indexPath, дори и да не е правилната категория, това е само за скорост/ лаг тестове). С други думи: Намерете редовете, които забавят вашия код.   -  person Larme    schedule 08.07.2018
comment
Използвайте инструмента за профилиране на времето, за да определите къде се изразходва времето   -  person Paulw11    schedule 08.07.2018
comment
Използвах Time Profiler, за да забележа, че настройката на цвета на градиента за клетките е виновникът тук и отнема повечето време. Но не знам как да подобря това, тъй като цветът на градиента на всяка клетка зависи от предадената категория.   -  person Shikhar varshney    schedule 08.07.2018
comment
Но цветът ограничен ли е? Искам да кажа, че сте прочели цветовете на категорията, но броят на вариантите ограничен ли е?   -  person Larme    schedule 08.07.2018
comment
@Larme, да, броят на категориите и цветовете е ограничен засега. Всяка категория е свързана с 2 цвята: - първоначалния цвят и крайния цвят.   -  person Shikhar varshney    schedule 08.07.2018
comment
Ако няма толкова много категории, можете да създадете всеки градиент и да ги скриете/покажете съответно. Или може би друго решение би било да използвате градиентна маска на два UIView, където задавате цветовете на фона (вижте там: stackoverflow.com/questions/22810839/)   -  person Larme    schedule 08.07.2018


Отговори (1)


Пишете твърде много код вътре в func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell, който не трябва да е там. Примери могат да бъдат задаване на радиус на ъгъла, цветове на фона, градиенти. Те се извикват всеки път. Можете да ги приложите, когато клетката е създадена в метода awakeFromNib.

Но това не е чак толкова голяма причина вашият изглед на маса да има проблеми с превъртането. Това е заради изображенията, които добавяте в този метод. Можете да използвате новия tableView(_:prefetchRowsAt:) метод на iOS 10, който ще бъде по-добро място за зареждане на изображения или подготовка на данни за клетките ви, преди да бъдат показани, като вземат неща като изображения там, което се извиква преди метода за изваждане от опашката.

Ето връзката към документацията на Apple:

https://developer.apple.com/documentation/uikit/uitableviewdatasourceprefetching/1771764-tableview

Изгледът на таблицата извиква този метод, докато потребителят превърта, предоставяйки пътищата на индекса за клетките, които е вероятно да покаже в близко бъдеще. Вашето внедряване на този метод е отговорно за стартирането на всички скъпи процеси за зареждане на данни. Зареждането на данни трябва да се извърши асинхронно и резултатите да бъдат предоставени на метода tableView(_:cellForRowAt:) в източника на данни на изгледа на таблицата. Изгледът на колекцията не извиква този метод за клетките, които изисква незабавно, така че вашият код не трябва да разчита на този метод за зареждане на данни. Редът на предоставените индексни пътеки представлява приоритета.

https://developer.apple.com/documentation/uikit/uitableviewdatasourceprefetching

person Amber K    schedule 08.07.2018