gpt4 book ai didi

swift - 呈现 Controller 时呈现加载图像的延迟

转载 作者:行者123 更新时间:2023-11-30 11:20:40 25 4
gpt4 key购买 nike

我正在重新创建一个简单版本的 snapchat 应用程序,但遇到了一个恼人的小问题,我似乎无法找到解决办法。

我查看了一些答案,例如 this one但没有运气。

总体概念与 snapchat 用户单击单元格相同,图像显示 x 时间然后消失。

以下是当前发生的情况: enter image description here

正如您所看到的,单击和实际呈现的图像之间存在轻微的延迟。

这是我用来执行实际图像加载的 CustomeIvageView:

    import UIKit

class CustomImageView: UIImageView {

func loadImage(urlString: String){

guard let url = URL(string: urlString) else {return}
URLSession.shared.dataTask(with: url) { (data, response, err) in
if let err = err {
print("failed to fetch user profile photoes", err)
}

guard let imageData = data else {return}
let photoImage = UIImage(data: imageData)


DispatchQueue.main.async {
self.image = photoImage
}
}.resume()
}
}

然后在我的 View Controller 中,我有这个:

class PictureViewController: UIViewController {

var snap: Snap? {
didSet{
usernameLabel.text = snap?.fromUser?.username
guard let imageUrl = snap?.imageUrl else {return}
previewImageView.loadImage(urlString: imageUrl)
}
}

lazy var previewImageView: CustomImageView = {
let iv = CustomImageView()
iv.contentMode = .scaleAspectFill
return iv
}()


override func viewDidLoad() {
super.viewDidLoad()

view.addSubview(previewImageView)
previewImageView.anchor(top: view.topAnchor, left: view.leftAnchor, bottom: view.bottomAnchor, right: view.rightAnchor, paddingTop: 0, paddingLeft: 0, paddingBottom: 0, paddingRight: 0, width: 0, height: 0)


guard let timer = snap?.timer else {return}

let delayTime = Double(timer)
delay(delayTime){
self.handleCancel()
}
}

func delay(_ delay:Double, closure:@escaping ()->()) {
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)
}

func handleCancel(){
self.dismiss(animated: false) {
}
}

编辑:显示我设置 PictureViewController 的位置。为了简洁起见,我省略了代码。

import UIKit
import Firebase

class ChatViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout{

var recievedSnaps = [Snap]()
var mappedSnaps = [String: [Snap]]()
let cellId = "cellId"

let picMessageView = PictureViewController()

override func viewDidLoad() {
super.viewDidLoad()

//Removed code for brevity

}

//OMITTED CODE FOR BREVITY


override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
let cell = collectionView.cellForItem(at: indexPath) as! ChatCell

picMessageView.snap = cell.snap

self.present(picMessageView, animated: false, completion: nil)


}

}

最佳答案

我尝试了您的代码,除了您关闭 PictureViewController 时的部分之外,它工作正常。您需要在主UI线程中调用dismiss,这样它才能正确执行。

func handleCancel(){
DispatchQueue.main.async {
self.dismiss(animated: false, completion: nil)
}
}

关于swift - 呈现 Controller 时呈现加载图像的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51295587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com