Загруженные изображения отображаются как негабаритные - PullRequest
0 голосов
/ 24 ноября 2018

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

Photo

Но пропорции должны выглядеть следующим образом:

Photo

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

Photo

Кроме того, изображение, загруженное с URL, отображается не сразу или после загрузки.Они отображаются после долгого нажатия.

Photo

Где я допустил ошибки в своем проекте?Почему я получаю увеличенное изображение, и оно отображается не сразу или с задержкой загрузки, а после долгого нажатия?

Код ViewController:

import UIKit
import Kingfisher

class ThirdViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var n = 1
var title_segue = ""
var id_segue = ""
var categories_segue = ""
var tags_segue = ""
//var refresh: UIRefreshControl!

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "videoCell", for: indexPath) as! VideoNewsCell
    //print("cell: "+(self.videonews?[indexPath.item].headline)!)
    //cell.imageView!.downloadImage(from: (self.videonews?[indexPath.item].image!)!)
    let resource = ImageResource(downloadURL: URL(string: (self.videonews?[indexPath.item].image!)!)!, cacheKey: self.videonews?[indexPath.item].image!)
    cell.imageView!.kf.setImage(with: resource)
    cell.titleVideo.text = self.videonews?[indexPath.item].headline
    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    print("Launch tableview in SecondView")
    title_segue = (self.videonews?[indexPath.item].headline)!
    id_segue = (self.videonews?[indexPath.item].id)!
    categories_segue = (self.videonews?[indexPath.item].categories)!
    tags_segue = (self.videonews?[indexPath.item].tag)!
    //print(("tableView: "+(self.news?[indexPath.item].headline)!))
    performSegue(withIdentifier: "video2newsbody", sender: self)
}

func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return self.videonews!.count
}

@IBOutlet weak var videoTableview: UITableView!
var videonews: [VideoNews]? = []

override func viewDidLoad() {
    super.viewDidLoad()
    getJSON()
}

@objc func getJSON(){

    let urlRequest = URLRequest(url: URL(string: "https://sportarena.com/wp-api/wp/v2/posts/?per_page=13&page=\(n)&tags=22&_embed")!)

    let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in

        if error != nil {
            print(error as Any)
            return
        }
        self.videonews = [VideoNews]()
        do {
            let json = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSArray

            for arrayX in json as! [[String: Any]] {
                let VN = VideoNews()

                var image_url = "https://sportarena.com/wp-content/uploads/2018/09/Grey_full.png"

                let tag0 = arrayX["tags"] as? NSArray

                let categories0 = arrayX["categories"] as? NSArray
                let title0 = arrayX["title"] as? [String: Any]
                let embedded = arrayX["_embedded"] as? [String: Any]
                let featuredmedia0 = embedded?["wp:featuredmedia"] as? NSArray
                let featuredmedia = featuredmedia0?[0] as? [String: AnyObject]
                let media_details = featuredmedia?["media_details"]
                let sizes0 = media_details?["sizes"] as? [String: AnyObject]
                let sizes = sizes0?["video-small"]
                if (featuredmedia0 != nil || featuredmedia != nil || media_details != nil || sizes0 != nil || sizes != nil) {
                    image_url = sizes?["source_url"] as! String
                }

                if let ID = arrayX["id"],
                    let date = arrayX["date"],
                    let title = title0!["rendered"] as? String,
                    let categories = categories0?[0],
                    let tags = tag0?[0] {
                    VN.headline = Html().convert(from: title)
                    VN.image = image_url
                    VN.id = "\(ID)"
                    VN.date = date as? String
                    VN.categories = "\(categories)"
                    VN.tag = "\(tags)"
                }
                self.videonews?.append(VN)
            }
            DispatchQueue.main.async {
                self.videoTableview.reloadData()
            }
        } catch let error {
            print(error)
        }
    }
    task.resume()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if (segue.identifier == "video2newsbody") {
        let NewsBodyController = segue.destination as! NewsBody
        NewsBodyController.title_news = title_segue
        NewsBodyController.id_news = id_segue
        NewsBodyController.categories_news = categories_segue
        NewsBodyController.tags_news = tags_segue
    }
}


}

1 Ответ

0 голосов
/ 25 ноября 2018

Похоже, что это как-то связано с циклом рисования, убедитесь, что содержимое представления изображения обрезается до границ прямоугольника рисования: enter image description here Затем вы также можете указать, какотрисовывать содержимое с помощью свойства contentMode, поскольку по умолчанию содержимое масштабируется по размеру, изменяя соотношение сторон содержимого при необходимости.Подробнее: https://developer.apple.com/documentation/uikit/uiview/contentmode

В дополнение к отображению (или отрисовке) изображений, полученных из Kingfisher, необходимо указать системе сделать это, один из вариантов - установить для imagesf от imageView значение nil при снятии очереди с ячейки изатем установите новое изображение, это вызовет систему рисования.

 let cell = tableView.dequeueReusableCell....
//print("cell: "+(self.videonews?[indexPath.item].headline)!)
//cell.imageView!.downloadImage(from: (self.videonews?[indexPath.item].image!)!)

   cell.imageView.image = nil //option 1

let resource = ImageResource(downloadURL: URL(string: (self.videonews?[indexPath.item].image!)!)!, cacheKey: self.videonews?[indexPath.item].image!)
cell.imageView!.kf.setImage(with: resource)
cell.titleVideo.text = self.videonews?[indexPath.item].headline

    // option 2 : cell.imageView.setNeedsDisplay()

return cell
...