我有一个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])
}
}
正如我所说,我正在寻找以任何方式提高效率的方法,以便我可以实际使用它。最好是,我可能只加载下一张和上一张幻灯片,但是我不知道该怎么做。
这也是一个屏幕截图,因此您可以看到它的外观。
答案 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!
}