2016-12-16 5 views

ответ

0

У меня был точно такой же вопрос не так давно.

Во-первых, вы должны установить режим содержимого изображения в Aspect Fit, НО НО этого недостаточно.

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

  1. Получить ширину и высоту
  2. Рассчитайте соотношение сторон вашего изображения let aspectRatio = Float(image.height)/Float(image.width)
  3. Используйте этот формат изображения, чтобы создать новое соотношение сторон ограничение для вашего зрения изображения.

Это копия (с добавленными комментариями) моего кода, где я справился с этой проблемой. Надеюсь, это поможет вам.

// aspectRatioCnst is IBOutlet reference to aspect ratio constraint I've set on mainImageView in Storyboard 
    if let aspectRatioCnst = aspectRatioCnst { 
     aspectRatioCnst.isActive = false 
    } 
    let aspectRatio = Float(imagePost.height)/Float(imagePost.width) 
    aspectRatioCnst = NSLayoutConstraint(
     item: self.mainImageView, 
     attribute: NSLayoutAttribute.height, 
     relatedBy: NSLayoutRelation.equal, 
     toItem: self.mainImageView, 
     attribute: NSLayoutAttribute.width, 
     multiplier: CGFloat(aspectRatio), 
     constant: 0) 
    if let aspectRatioCnst = aspectRatioCnst { 
     self.mainImageView.addConstraint(aspectRatioCnst) 
     aspectRatioCnst.isActive = true 
     self.mainImageView.layoutIfNeeded() 
    } 
    if let image = imagePost.loadedImage { 
     self.mainImageView.image = image 

    } else if let imageURL = URL(string: imagePost.fileURL) { 
     DispatchQueue.global(qos: .background).async { 
      // UIImage extension with downloadedFromURL method 
      UIImage.downloadedFromURL(url: imageURL, withCallback: { (image) -> (Void) in 
       DispatchQueue.main.async { 
        self.imageLoadingActivityIndicator.stopAnimating() 
        self.mainImageView.image = image 
        self.imagePost?.loadedImage = image 
       } 
      }) 
     } 
    } 
+0

, что если изображение загружается асинхронно. Тогда как код будет знать высоту и ширину изображения? –

+0

Это хороший момент. Я думал, что мне тоже не придется копировать эту часть, но, поскольку вы спросили, я обновил свой ответ. Постскриптум В ответе JSON, который указывает на URL-адрес изображения, я получаю высоту и ширину изображения, поэтому мне не нужно его вычислять. – JPetric

+0

В принципе, я сначала загружаю все метаданные изображений, где у меня есть высота и ширина каждого изображения и URL, где я могу загрузить изображение. И затем, когда я деактивирую ячейки таблицы, я просто асинхронно загружаю изображения. Надеюсь, я немного это объяснил. – JPetric

0

Сначала установите нижнюю содержание в высоту, как это,

enter image description here

Затем установите ваше изображение ограничивает, как это,

enter image description here

Затем сделать это в коде,

func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 

     let imageNew = UIImage(named: "test") //Set your image here 
     let oldWidth = imageNew!.size.width 
     let scaleFactor = tableView.frame.size.width/oldWidth 

     let newHeight = imageNew!.size.height * scaleFactor 
     let newWidth = oldWidth * scaleFactor 

     //Finally to get cell size just add the bottom part height for othercontents to ImageHeight here 
     let CellSize = CGSize(width: newWidth, height: (newHeight + 40)) 
     return CellSize.height 

    } 


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

     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableViewCell 
     cell.NewImage.image = UIImage(named: "test") 
     return cell 

    } 

Вы должны получить Somthing как это, enter image description here

Смежные вопросы