ios 如何从UICollectionView缩放图像?

bf1o4zei  于 2023-01-03  发布在  iOS
关注(0)|答案(2)|浏览(163)

我在Swift中创建了一个UICollectionView,其中包含从API中拍摄的照片:https://jsonplaceholder.typicode.com/photos
我已经创建了一个窗口,我的图像可以设置为全屏在这里:

extension ViewController: UICollectionViewDataSource, UICollectionViewDelegate{
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return posts.count
    }
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = myCollectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! MyCollectionViewCell
        let url = URL(string: "https://via.placeholder.com/600/\(posts[indexPath.row].thumbnailUrl)")
        cell.myImageView.downaloadImage(from: url!)
        cell.myImageView.layer.cornerRadius = 25
        cell.myLabelName.text = posts[indexPath.row].title
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath)
        let alert = UIAlertController(title: "FullScreen", message: "Are you sure you want to see the image fullscreen?", preferredStyle: .alert)
        let actionyes = UIAlertAction(title: "Yes", style: .default) { action in
            cell?.frame = UIScreen.main.bounds
            cell?.backgroundColor = .magenta
            cell?.contentMode = .scaleAspectFit
            //de schimbat imagine thumbnailURL cu url
            cell?.isUserInteractionEnabled = true
            let tap = UITapGestureRecognizer(target: self, action: #selector(self.dismissFullscreenImage))
            cell?.addGestureRecognizer(tap)
            self.view.addSubview((cell)!)
            self.navigationController?.isNavigationBarHidden = true
            self.tabBarController?.tabBar.isHidden = true
        }
        let actionno = UIAlertAction(title: "No", style: .default) { action in
            
        }
        alert.addAction(actionno)
        alert.addAction(actionyes)
        present(alert, animated: true)
        
    }
    
    @objc func dismissFullscreenImage(sender: UITapGestureRecognizer) {
        let alert2 = UIAlertController(title: "Go Back", message: "Are you sure you want to go back?", preferredStyle: .alert)
        let actionyes2 = UIAlertAction(title: "Yes", style: .default) { action in
            self.navigationController?.isNavigationBarHidden = false
            self.tabBarController?.tabBar.isHidden = false
            sender.view?.removeFromSuperview()
        }
        let actionno2 = UIAlertAction(title: "No", style: .default) { action in
            
        }
        alert2.addAction(actionno2)
        alert2.addAction(actionyes2)
        self.present(alert2, animated: true)
    }

}

我试着放大全屏的图像,但我不知道从哪里开始。我的结构是这样的:

import Foundation

struct Post : Codable
{
    let albumId : Int
    let id : Int
    let title : String
    let url : String
    let thumbnailUrl : String
}

另外,当我退出全屏时,我的图像消失了,我不知道如何保持它。我认为问题出在这里:

sender.view?.removeFromSuperview()

我可以在代码中缩放图片吗?或者我还需要其他东西吗?我见过很多人使用滚动视图,但我的图片是在集合视图单元格中,如下所示:

import UIKit

class MyCollectionViewCell: UICollectionViewCell {
    
    @IBOutlet var myImageView: UIImageView!
    
    @IBOutlet var myLabelName: UILabel!
}
4sup72z8

4sup72z81#

是的,调用sender.view?.removeFromSuperview()是不好的,因为您正在从集合视图中移除集合视图单元格。您不能这样做。
当您想要全屏显示图像时,不应对集合视图单元格执行任何操作。相反,请使用单元格的图像视图中的图像创建一个新的UIImageView,并全屏显示该新图像视图。当您想要关闭它时,只需移除该图像视图。这将使原始集合视图单元格及其图像视图保持不变,并且在缩放后仍然可见。
如果创建一个与单元格的图像视图大小和位置相同的新图像视图,然后将新图像视图设置为全屏动画,效果也会很好。
如果您希望允许用户放大图像,可以将新的图像视图放入UIScrollView中,但这超出了您最初问题的范围。

hsvhsicv

hsvhsicv2#

您可以在单元格中使用ImageScrollView代替ImageView。下面是相同的链接。
https://github.com/huynguyencong/ImageScrollView

相关问题