Swift 4 ImageScrollView изменяет размеры видимых ячеек в UITableView - PullRequest
0 голосов
/ 29 мая 2018

Я использую какао-боб ImageScrollView v1.5 внутри UITableViewCell (Swift 4).Я загружаю изображения из Firestore, используя SDWebImage (но также пробовал Kingfisher без изменений в моей проблеме).Мои изображения имеют размер 700x700 и отображаются в ImageScrollView, который, в зависимости от устройства, составляет около 400x100.Я установил для SDWebImage imageContentMode значение widthFill .Я поворачиваю изображение, чтобы получить его в форме, которую я хочу для таблицы.Я использую его в обычной ориентации в других местах.При первом показе моих клеток изображения отображаются правильно.Если я вернусь на предыдущую страницу и снова покажу те же результаты в таблице, то у видимых ячеек изображения будут больше не соответствовать по ширине, теперь они слишком широки.Если я прокручиваю вниз, скрывая эти ячейки, все новые ячейки отображаются правильно, когда я прокручиваю назад вверх, неправильные ячейки теперь отображаются правильно.Происходит в симуляторе и реальном телефоне.

Вот важные части моего класса UITableViewCell:

class MyTableCell: UITableViewCell {
var ski : Ski!
var skiImageView: UIImageView = UIImageView()
@IBOutlet weak var skiImageScrollView: ImageScrollView!


 func configureCell(ski: Ski) {
    self.ski = ski
    let imageUrl = ski.imageUrl!
    let url = URL(string: imageUrl)
     skiImageView.sd_setImage(with: url, placeholderImage: placeholderImage, options: [.retryFailed, .continueInBackground]
        , completed: {
            (image, error, cacheType, url) in
            if (error != nil) {
                print("ConfigureCell Error : \(error!)")
                return;
            }
            let rotatedImage = self.imageRotatedByDegrees(oldImage: image!, deg: 90.0)
            self.skiImageScrollView.display(image: rotatedImage)                var image = self.skiImageView.image!
            self.skiImageScrollView.imageContentMode = .widthFill

    })

}

func imageRotatedByDegrees(oldImage: UIImage, deg degrees: CGFloat) -> UIImage {
    //Calculate the size of the rotated view's containing box for our drawing space
    let rotatedViewBox: UIView = UIView(frame: CGRect(x: 0, y: 0, width: oldImage.size.width, height: oldImage.size.height))
    let t: CGAffineTransform = CGAffineTransform(rotationAngle: degrees * CGFloat.pi / 180)
    rotatedViewBox.transform = t
    let rotatedSize: CGSize = rotatedViewBox.frame.size
    //Create the bitmap context
    UIGraphicsBeginImageContext(rotatedSize)
    let bitmap: CGContext = UIGraphicsGetCurrentContext()!
    //Move the origin to the middle of the image so we will rotate and scale around the center.
    bitmap.translateBy(x: rotatedSize.width / 2, y: rotatedSize.height / 2)
    //Rotate the image context
    bitmap.rotate(by: (degrees * CGFloat.pi / 180))
    //Now, draw the rotated/scaled image into the context
    bitmap.scaleBy(x: 1.0, y: -1.0)
    bitmap.draw(oldImage.cgImage!, in: CGRect(x: -oldImage.size.width / 2, y: -oldImage.size.height / 2, width: oldImage.size.width, height: oldImage.size.height))
    let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
    UIGraphicsEndImageContext()
    return newImage
}

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

1 Ответ

0 голосов
/ 30 мая 2018

Вы можете попробовать следующее:

imageScrollView.imageContentMode = .aspectFit

до

self.skiImageScrollView.display(image: rotatedImage)

...