如何在分页 UIScrollView 中显示确定的项目,而不是仅从 0 加载它

Posted

技术标签:

【中文标题】如何在分页 UIScrollView 中显示确定的项目,而不是仅从 0 加载它【英文标题】:How to display a determined item in a paging UIScrollView instead of just loading it from 0 【发布时间】:2019-01-20 17:11:09 【问题描述】:

我想重新创建与 ios 内置图库应用程序在基本级别中所做的相同的概念,这意味着拥有一组图像并能够单独查看它们并向右或向左滑动以查看其他图像数组。出于测试目的,我设置了一个小的 UIImages 数组,然后为数组中的每个图像添加一个单独的子视图到启用分页的滚动视图。一切都按预期工作,但是每次我加载应用程序时,用户都会从第一项(数组中的第 0 项)开始,并且我找不到手动选择需要显示的第一个图像的方法,例如如果我希望scrollView 首先显示数组中的第三个图像,然后能够向左或向右滑动以翻页到数组中的其他图像怎么办?我找不到解决办法。

我尝试添加其他子视图,但这不起作用,应用程序按预期工作,但总是从数组中的第一项开始,我想手动选择该项,所以如果我想显示第三张图像在数组中,collectionView 就是这样做的。我有六个用于测试目的的图像(每个都称为 menu_icon_(0...5))

@IBOutlet weak var scrollView: UIScrollView! 
    didSet 
        scrollView.delegate = self
    


var images:[ImagePreviewView] = [ImagePreviewView]()
override func viewDidLoad() 
    super.viewDidLoad()
    images = generateImages()
    setupSlideScrollView(imagesPreviews: images)


func generateImages() -> [ImagePreviewView]
    var array:[ImagePreviewView] = []

    for i in 0...5 
        let imagePreview = Bundle.main.loadNibNamed("ImagePreview", owner: self, options: nil)?.first as! ImagePreviewView
        imagePreview.userSelectedImageView.image = UIImage(named: "menu_icon_\(i)")
        array.append(imagePreview)
    
    return array


func setupSlideScrollView(imagesPreviews : [ImagePreviewView]) 
    scrollView.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height)
    scrollView.contentSize = CGSize(width: view.frame.width * CGFloat(imagesPreviews.count), height: view.frame.height)
    scrollView.isPagingEnabled = true

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


func scrollViewDidScroll(_ scrollView: UIScrollView) 
    let pageIndex = round(scrollView.contentOffset.x/view.frame.width)
    print("Page Index is \(pageIndex)")

我想以这样一种方式实现此代码,即用户将图像添加到集合视图中,并且当用户点击图像时,indexPath.item 被发送到此viewController 并显示用户的图像选中,而不是数组中的第一个图像,然后能够向右或向左滑动。我试图通过后一个视图控制器逻辑重新创建它的样子。

【问题讨论】:

【参考方案1】:

因此,您将在创建此 VC 时收到索引。让我们称之为selectedIndex

var selectedIndex = 0 //I give 0 as initial value but it will be updated anyways.

然后在viewDidAppear 中尝试以下操作:

let width = view.frame.width
scrollView.setContentOffset(CGPoint(x: width * selectedIndex, y: 0), animated: false)

因此,当用户点击图像时,您将在 VC 中收到该图像的索引号,然后滚动视图的 setContentOffset 到屏幕宽度乘以 selectedIndex,这应该会给您想要的结果。

【讨论】:

以上是关于如何在分页 UIScrollView 中显示确定的项目,而不是仅从 0 加载它的主要内容,如果未能解决你的问题,请参考以下文章

iOS:无法在分页的 UIScrollView 中的 UITableView 之间滚动

UITextView 在分页 UIScrollView 内滚动不起作用

分页 UIScrollView 内的 UIScrollView

如何在分页中获取特定行的页码

UIScrollview 分页中的 UITextview

如何在分页中查看第二页