Ячейки просмотра коллекции не загружают изображения правильно

Я разрабатываю приложение iOS, которое загружает сообщения с сервера в UICollectionView. Ячейка просмотра коллекции включает UIImageView, который фиксируется в нижней части ячейки.

UICollectionViewCell

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

UICollectionView

Я пробовал множество решений, но ничего до сих пор не работал.

То, что я подозреваю, заключается в том, что изображения не закончили загрузку до того, как они были установлены в UIImageView каждой ячейки (кроме последнего в этом случае). Это не представляется возможным, хотя по мере перезагрузки ячеек после получения успешного ответа.

Это мой код для этой конкретной функции (с использованием Alamofire)

func getAllPosts(){

    let url =  "\(Constants.baseURL)/posts/"
    let parameters = ["user_id": "\(userProfile!.getId())"]

    Alamofire.request(.POST, url, parameters: parameters, encoding: .JSON)
        .validate(contentType: ["application/json"])
        .responseString { response in
            switch response.result {

            case .Success:

                var postsArray = Array<[String: AnyObject]>()

                do {

                    let json = try NSJSONSerialization.JSONObjectWithData(response.data!, options: NSJSONReadingOptions.MutableContainers)



                    for post in json as! [AnyObject] {

                        postsArray.append(post as! [String: AnyObject])

                    }

                    //invert array of posts so that latest load first!

                    postsArray = postsArray.reverse()

                } catch {

                }

                //convert json to Post objects and reload the view

                self.initialisePosts(postsArray)

                self.collectionView?.reloadData()


            case .Failure(let error):
                print(error)
            }
    }  
}

Вся помощь приветствуется.

Изменить: Ниже приведены текущие ограничения для UIImageView

Ограничения

Изменить 2: Вот код форматирования ячеек

override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    // get a reference to our postcell with no image
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifiers[0], forIndexPath: indexPath) as! PostCell

    guard let _: Post? = posts[indexPath.row] else {
        return cell
    }

    return configurePostCell(cell, post: posts[indexPath.row])!
}

func configurePostCell(cell: UICollectionViewCell, post: Post) -> PostCell?{
    if let cell = cell as? PostCell {

        cell.author.text = post.user_name
        cell.date.text = formatter.stringFromDate(post.pub_date!)
        cell.desc.text = post.desc


        cell.layer.cornerRadius = 5 //set corner radius here

        cell.advertImage.image = post.advert?.advert_image


        return cell
    }

    return nil
}

Обновление: с помощью @Michael Advice Я обнаружил, что изображения соты загружаются правильно.

Правильно загрузить изображение

, но высота ячейки таинственно обрезается на 50 пикселей.

Размер ячейки редактора раскадровки

Размер ячейки редактора раскадровки

Размер ячейки во время выполнения

Размер ячейки во время выполнения

Это, кажется, проблема, но я еще не нашел решение.

Обновление: через два часа после награды я решил присудить его @Michael, потому что его ответ помог мне продолжить исследование моей проблемы, которая продолжается.

Ответ 1

Во-первых, используйте кнопку "Инициализация просмотра отладки", чтобы проверить наличие аномалий в ячейках таблицы во время выполнения.

Затем точка останова при создании ячейки и проверите UIImage, который вы собираетесь установить в ячейку, и убедитесь, что размер правильный. Если вы назначили изображение, которое вы загрузили в локальную переменную, вы, вероятно, тоже можете его просмотреть, чтобы посмотреть, выглядит ли оно правильно.

Затем, если все это кажется разумным, проверьте, что ваш код автомакета надежный.

Проверьте, удалив загрузку изображений из ситуации. Я бы сделал это:

  • Удалите настройку изображения вообще, но установите фон изображения в UIColor.Red или что-то еще и проверьте, что все они хорошо расположены как немного больше, чем обычные UIViews.
  • Вставьте изображение в пакет приложений в виде PNG и установите его вместо загруженного изображения. Еще раз посмотрим, как это проявляется.
  • Попробуйте изображение разных размеров в комплекте приложения и снова проверьте (если это необходимо - возможно, все ваши изображения имеют одинаковый размер)

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

Ответ 2

Измените 15: 4Ratio на постоянную высоту (80px) и установите heightForRowAtIndexPath на константу (250px)