2016-04-04 3 views
1

Я пытаюсь установить imageView по стандарту UITableViewCell из удаленного источника с использованием заполнителя. У меня есть эта проблема независимо от использования SDWebImage или AlamofireImage в качестве библиотеки.Предотвращение просмотра изображения UITableViewCell из-за изменения размера при нажатии

Вот как выглядит клетка после начальной загрузки:

How the image appears in the cell after the initial load

Затем, когда клетка прослушивались/Reloaded это выглядит следующим образом:

Image shrinks and moves the text when tapped/reloaded

В раскадровка, я скорректировал высоту строки на 60 пунктов вместо стандартных 44 очков. Если я вернусь к высоте до 44 очков, проблема больше не будет присутствовать.

Я считаю, что эта проблема больше связана с пользовательской высотой ячейки, а не с библиотекой, предоставляющей местозаполнитель. Я сделал вопрос на AlamofireImage in case it was a problem with the library, но, оказывается, это не тот случай.

Как я могу сначала установить изображение в нужном размере или предотвратить изменение размера при перезагрузке?

Вот код моего подкласса UITableViewCell. Обратите внимание, что проблема возникает, даже если я удаляю код вставки фрейма внутри layoutSubviews.

class CategoryTableViewCell: UITableViewCell { 

    var category: Category! { 
     didSet { 
      self.updateCategory(category) 
     } 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     self.imageView?.frame = CGRectInset(self.imageView!.frame, 10, 10) 
    } 

    private func updateCategory(category: Category) { 
     self.textLabel?.text = category.name 

     self.imageView?.sd_setImageWithURL(category.largeImage ?? nil, placeholderImage: UIImage(named: "DefaultCategory")) 
    } 
} 

Я теперь также установить следующие переопределения на контроллере представления таблицы, б он не имел никакого эффекта.

override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return 60; 
} 
     
override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    return 60; 
} 
+0

У вас есть код, чтобы поделиться? Вы делаете что-нибудь «фанки» с подклассом 'UITableViewCell' (если есть)? Любые конфликтующие ограничения в построителе интерфейса? – BenJammin

+0

Попробуйте установить «heightForRowAtIndexPath» в tableview на 60. или «оцененныйHeightForRowAtIndexPath» – kye

+0

Я добавил код из своего подкласса. Кроме того, нет противоречивых ограничений. – Dwight

ответ

1

Я хотел бы оставить комментарий, но у меня недостаточно репутации, чтобы сделать это. Следовательно, «ответ».

Я помню, что раньше сталкивался с этой проблемой, и это было связано с тем, что я не устанавливал для этого ограничения на моем UITableViewCell XIB. Как только я установил его на фиксированную ширину/высоту и привязал его к краям родительского представления, проблема была решена сама собой.

+0

является правильным. Если это не решит вашу проблему, пожалуйста, проверьте режим содержимого UIImageView. –

+0

Ячейка таблицы в моей раскадровке - это просто пустой стандартный UITableViewCell. Я не могу установить никаких ограничений на него, так как я не изменил его, добавив какие-либо подзаголовки. – Dwight

+0

Я вижу.Мое предположение: вы получаете доступ к образцу по умолчанию в UITableViewCell, где его фреймы устанавливаются как свойство только для чтения, и в этом случае он устанавливается по умолчанию по умолчанию 44 балла после перерисовки. См. Эту ссылку: http://stackoverflow.com/questions/18129461/uiimageview-resizes-automatically – rach

0

Я использую SDWebImage, и это сообщение помогло мне SDWebImage fixed width cell images.

Вот мое решение, просто сохранить первоначальный кадр ImageView, текст и detailText, и восстановить его на layoutSubviews()

class MoreTableViewCell: UITableViewCell { 

    var imageFrame: CGRect? = nil 
    var textFrame: CGRect? = nil 
    var detailTextFrame: CGRect? = nil 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     if imageFrame == nil { 
      imageFrame = imageView?.frame 
      textFrame = textLabel?.frame 
      detailTextFrame = detailTextLabel?.frame 
     } 

     if imageFrame != nil { 
      self.imageView?.frame = imageFrame! 
     } 

     if textFrame != nil { 
      self.textLabel?.frame = textFrame! 
     } 

     if detailTextFrame != nil { 
      self.detailTextLabel?.frame = detailTextFrame! 
     } 
    } 
} 
Смежные вопросы