uiscrollview 中的可重复内容 - Swift
Posted
技术标签:
【中文标题】uiscrollview 中的可重复内容 - Swift【英文标题】:Repeatable content in uiscrollview - Swift 【发布时间】:2015-08-11 04:48:57 【问题描述】:我想知道是否有人可以指导我正确的方向。
我正在布置一个带有 2 个 uiscrollviews 的 uiview。 1 个是垂直的,另一个在视图的一半处是水平的。
我的结构设置为可以向下滚动到水平页面,然后可以水平滚动 5 页(硬编码)。水平滚动视图启用了分页并占据了屏幕的整个宽度(自动布局)。这一切都很好。 uiscrollview 包含在带有约束的 uiview 中。
5 个(页面)子视图中的每一个都包含相同的元素(日期、名称、标题、图像等都居中),但是内容是从 coredata 解析的。第 1 页 = 乔,第 2 页 = 简等
我无法解决的部分是如何构建这些本质上的子视图。如果我在 uiscrollview 中放置一个标签,这将在第 2 页上滚动到屏幕之外。您建议在滚动视图中处理 5(或 10)页具有相同元素但内容不同的最佳方法是什么?
感谢任何建议。
【问题讨论】:
【参考方案1】:如果我理解正确,请查看UICollectionView
s。他们非常投入,但他们的行为就像一个超级强大的UITableView
s,几乎可以做任何事情(包括基本的分页和水平/垂直滚动。
尝试使用单行设置 UICollectionViewFlowLayout
并使元素填满整个页面(例如,使用 func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
动态调整单元格大小以填充您的视口)
然后将UICollectionViewCell
子类化为您想要的那种“页面”。
这有点牵扯,你会阅读很多 docs 但这可能是做你想做的最好的方式,如果你决定你想要超过 5-10 页,它很容易扩展或者你想要为每个页面添加更多 UI。
一个不那么灵活的更简单的替代方法是创建一个带有方法/初始化程序的UIView
子类,以便用您需要的数据填充它,然后对所有数据运行一个 for 循环,创建UIScrollView
内的页面,其中每个的框架是 CGRect(x: screenWidth * i, y: 0, width: screenWidth, height: yourHeight)
,其中 i
是您的 for 循环变量,以便页面边缘到边缘并填满屏幕。当然根据自己的情况调整公式。
重新阅读您的问题后,您可能只是想要一个静态标签,该标签会根据页面中可滚动的内容更改其内容。为此,将UILabel
作为子视图添加到包含滚动视图的同一父视图中,将其添加在 UIScrollView
之后(或者只需调用bringSubviewToFront
以将其作为z-index forward) 使其位置独立于滚动视图。要使用页面滚动更新它,请连接到 func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>)
并通过
targetContentOffset
计算页面
let offset = targetContentOffset.memory
let page = Int(offset.x / scrollView.frame.size.width)
然后使用页面作为索引从数据数组中填充标签(但请确保检查数组边界,因为滚动到任一边缘可能会产生 -1
或 array.count
甚至更多)。
编码愉快,抱歉有多种选择!如果我仍然没有回答您的问题,请告诉我
【讨论】:
感谢您的选择。我尝试了一个静态标签,但它没有“滚动”并且看起来不太好。我刚刚发现在 for 循环中使用多个 uiview 的东西。我会试一试,但似乎仍然很投入,并且不确定它如何与自动布局一起使用。我还将阅读集合视图。听起来很有希望。 再次感谢您的建议。我可以选择创建多个子视图,获取它们的宽度并设置滚动视图。一切都很好。以上是关于uiscrollview 中的可重复内容 - Swift的主要内容,如果未能解决你的问题,请参考以下文章
带有空 UIScrollView 的可滚动内容大小歧义(XCode 6)