swift UITableView изостава с изображения

Бих искал да покажа изображения в TableView, така че създадох персонализирана клетка

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->
    UITableViewCell {

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as TableViewCell

    if let image =  UIImage(data: self.photos[indexPath.row].image) {

        if image.size.width > image.size.height {

            tableView.rowHeight = view.bounds.width *  0.71

        } else { tableView.rowHeight = view.bounds.width *  1.22

        }

        cell.cellImage.image = image
    }

Имах проблем как да коригирам височината на клетката, така че за всяко изображение да се изчислява отделно и използвам подизгледи на клипове за ImageView.

Проблемът е, че когато започна да добавям снимки, превъртането на таблицата е много забавено :( Дори когато премахна изчислението на височината на клетката, нищо не се промени.

Някой има ли идея как да стане гладко в Swift?


person chrisco    schedule 23.12.2014    source източник


Отговори (1)


Първо, никога не трябва да променяте височините на редовете по средата на създаването на клетки на таблица. Промените във височината на реда са много скъпи за UITableView. Трябва да използвате UITableViewDelegate метода tableView(heightForRowAtIndexPath:), за да укажете на табличния изглед каква трябва да бъде височината на всяка клетка. Това почти сигурно е вашият основен проблем.

По-малък проблем е, че създаването на UIImage от данни е малко скъпо и продължавате да създавате нови изображения и след това да ги изхвърляте.

Решението и за двете е просто. Създайте всичките си изображения веднъж и ги поставете във вашия модел. Тогава tableView(cellForWRowAtIndexPath:) може просто да присвои вече създаденото изображение към изгледа на изображението, а tableView(heightForRowAtIndexPath:) е тривиално за изпълнение.

(Предполагам тук, че всъщност искате всяка клетка да има различна височина. Малко е объркващо от въпроса ви дали случаят е такъв. Ако искате всички те да са еднакви, просто задайте rowHeight веднъж, когато данните ви постъпват. )

person Rob Napier    schedule 23.12.2014
comment
основният проблем беше с UIImage - когато ги създам веднъж в началото, зареждането е много по-бързо. Но все още имам забавяния при превъртане надолу - преместих създаването на клетка към heightForRowAtIndexPath: let image = self.photosTemp[indexPath.row].image if image.size.width › image.size.height { return view.bounds.width * 0.71 } else { return view.bounds.width * 1.22 } - person chrisco; 08.01.2015
comment
creating a UIImage from data is somewhat expensive това ме спаси! - person Brian; 28.05.2015