有效地在UIScrollView中加载许多视图

时间:2019-06-20 16:11:00

标签: ios swift

我有一个UIScrollView,试图将其用作图像查看器。为此,我启用了分页,并向每个图像的视图添加“幻灯片”,包括UIImageView以及多个标签和按钮。当我只需要显示几张幻灯片时,这种方法非常有效,但是我将需要有100多张幻灯片,而且我遇到了非常糟糕的性能问题。 当我展示ViewController并因此设置ScrollView时,我得到了10到15秒的良好延迟。显然,加载这么多的视图有点麻烦。

所以我想知道你们中的任何人是否有一个想法,我该如何提高效率。

我曾尝试在以前的VC中制作幻灯片数组,并通过它,而不是在现场创建它,这虽然有所帮助,但不足以使其让人接受,尤其是因为更改设备方向需要我再次设置ScrollView(因为Slides的高度/宽度将关闭)。

以下是设置幻灯片并将其显示在ScrollView上的功能:

    func createSlides() -> [Slide] {
    print("creating Slides")

    let Essence = EssenceModel.Essence
    var ImageArray = [Slide]()

    var slide: Slide
    var count = 0


    for img in Essence{
        count += 1

        slide = Bundle.main.loadNibNamed("Slide", owner: self, options: nil)?.first as! Slide
        slide.imageView.image = UIImage(named: img.imageUrl)
        slide.isUserInteractionEnabled = true
        slide.textLabel.text = img.description
        slide.likeButton.imageView?.contentMode = .scaleAspectFit
        slide.hero.id = img.heroID

        slide.tag = count

        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(showOrHide))
        slide.imageView.addGestureRecognizer(tapGesture)
        let dismissGesture = UITapGestureRecognizer(target: self, action: #selector(dismissVC))

        slide.backButton.addGestureRecognizer(dismissGesture)
        slide.backButton.isUserInteractionEnabled = true
        let swipeUp = UISwipeGestureRecognizer(target: self, action: #selector(swipedUp))
        swipeUp.direction = .up
        slide.addGestureRecognizer(swipeUp)

        let swipeDown = UISwipeGestureRecognizer(target: self, action: #selector(swipedDown))
        swipeDown.direction = .down
        slide.addGestureRecognizer(swipeDown)

        let slideRecognizer = UITapGestureRecognizer(target: self, action: #selector(startSlideshow))
        slide.slideButton.addGestureRecognizer(slideRecognizer)
        slide.likeButton.imageView?.contentMode = .scaleAspectFit

        slide.setupZoom()

        ImageArray.append(slide)
    }
    count = 0
    print(ImageArray.count)
    return ImageArray
}


func setupSlideScrollView(slides : [Slide]) {
    scrollView.subviews.forEach { $0.removeFromSuperview() }

        scrollView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)
        scrollView.contentSize = CGSize(width: view.frame.width * CGFloat(slides.count), height: view.frame.height)
        scrollView.isPagingEnabled = true

        for i in 0 ..< slides.count {
            slides[i].frame = CGRect(x: view.frame.width * CGFloat(i), y: 0, width: view.frame.width, height: view.frame.height)

            scrollView.addSubview(slides[i])

        }

}

正如我所说,我正在寻找以任何方式提高效率的方法,以便我可以实际使用它。最好是,我可能只加载下一张和上一张幻灯片,但是我不知道该怎么做。

这也是一个屏幕截图,因此您可以看到它的外观。

w w

2 个答案:

答案 0 :(得分:0)

代替使用uiscroll并出现性能问题。您应该使用uicollectionview,水平滚动带有一个图像和按钮的自定义单元格。

答案 1 :(得分:0)

做这样的事会更好:

1)添加UICollectionView

2)添加具有restoreID的UITableViewCell

3)将关系添加到您的控制器/视图

4)设置水平滚动方向:https://www.screencast.com/t/wmPiwVdY

5)然后创建类似这样的逻辑:

class ImageCollectionViewVC: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

    @IBOutlet weak var collectionView: UICollectionView!
    private var images = [Slide]()

    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView.delegate = self
        collectionView.dataSource = self
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return images.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        guard let imageCell = collectionView.dequeueReusableCell(withReuseIdentifier: "ImageSlideCellRestorationID", for: indexPath) as? ImageSlideCell else {
            return ImageSlideCell()
        }
        imageCell.image.image = UIImage(named: images[indexPath.row].imageUrl)
        return imageCell
    }
}


class ImageSlideCell: UICollectionViewCell {
    @IBOutlet weak var image: UIImageView!
}