Ios 如何使用UIScrollView显示下一个视图的边缘
我是ios开发的新手,我想用scrollview显示下一个视图的边缘。我从中得到了帮助,这是我的视图层次结构 1) 我将scrollview从故事板添加到了view控制器的俯视图中 2) 我以编程方式将视图添加为容器视图和集合视图,作为scrollview的子视图Ios 如何使用UIScrollView显示下一个视图的边缘,ios,swift,Ios,Swift,我是ios开发的新手,我想用scrollview显示下一个视图的边缘。我从中得到了帮助,这是我的视图层次结构 1) 我将scrollview从故事板添加到了view控制器的俯视图中 2) 我以编程方式将视图添加为容器视图和集合视图,作为scrollview的子视图 class ExampleViewController: UIViewController { var scrollView = UIScrollView() var container1 = UIView() var conta
class ExampleViewController: UIViewController {
var scrollView = UIScrollView()
var container1 = UIView()
var container2 = UIView()
var container3 = UIView()
override func viewDidLoad() {
super.viewDidLoad()
scrollView.isPagingEnabled = true
scrollView.clipsToBounds = false
view.addSubview(scrollView)
container1.backgroundColor = .red
container2.backgroundColor = .blue
container3.backgroundColor = .yellow
scrollView.addSubview(container1)
scrollView.addSubview(container2)
scrollView.addSubview(container3)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
scrollView.frame = CGRect(x: 0, y: 0, width: view.bounds.width - peekAmount, height: view.bounds.height)
scrollView.contentSize = CGSize(width: 3 * scrollView.frame.width, height: scrollView.frame.size.height)
container1.frame.size = containerSize
container2.frame.size = containerSize
container3.frame.size = containerSize
var xPosition: CGFloat = 0
container1.frame.origin = CGPoint(x: xPosition, y: 0)
xPosition = container1.frame.maxX
container2.frame.origin = CGPoint(x: xPosition, y: 0)
xPosition = container2.frame.maxX
container3.frame.origin = CGPoint(x: xPosition, y: 0)
}
var containerSize: CGSize {
return CGSize(width: scrollView.frame.size.width, height: scrollView.frame.size.height)
}
var peekAmount: CGFloat {
return 80
}
}
我显示了下一个视图的边缘,但当我转到下一页时,事情并不顺利,我不知道如何处理这件繁重的事情,也不知道哪种方法最适合完成这项特定任务。这是我的密码。我真的被卡住了,我真的不知道该怎么办
func addCollectionViewsInsideScrollView(){
scrollView?.delegate = self;
scrollView?.isPagingEnabled=true
scrollView.indicatorStyle = UIScrollViewIndicatorStyle.white
for i in 0...2 {
if i == 0 {
frame = CGRect(x: scrollWidth * CGFloat (i), y: 0, width: scrollWidth - 45,height: scrollHeight)
subView1 = UIView(frame: frame)
subView1.backgroundColor = .white
scrollView?.backgroundColor = .white
scrollView?.addSubview(subView1)
subView1.addSubview(collectionView0)
collectionView0.frame = CGRect(x: subView1.bounds.origin.x, y: 0, width: subView1.bounds.width,height: subView1.bounds.height)
}
if i == 1 {
frame = CGRect(x: scrollWidth * CGFloat (i) - 20, y: 0, width: scrollWidth - 45,height: scrollHeight)
subView2 = UIView(frame: frame)
scrollView?.addSubview(subView2)
subView2.addSubview(collectionView1)
collectionView1.frame = CGRect(x: subView2.bounds.origin.x, y: 0, width: subView2.bounds.width,height: subView2.bounds.height)
}
if i == 2 {
frame = CGRect(x: scrollWidth * CGFloat (i) - 40, y: 0, width: scrollWidth - 45,height: scrollHeight)
subView3 = UIView(frame: frame)
scrollView?.addSubview(subView3)
subView3.addSubview(collectionView2)
collectionView2.frame = CGRect(x: subView3.bounds.origin.x, y: 0, width: subView3.bounds.width,height: subView3.bounds.height)
}
}
scrollView?.contentSize = CGSize(width: (scrollWidth * 3), height: scrollHeight)
}
func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
setIndiactorForCurrentPage()
}
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if myPageNo == 1 {
frame = CGRect(x: scrollWidth - 20, y: 0, width: scrollWidth - 40,height: scrollHeight)
let subView = UIView(frame: frame)
self.scrollView?.addSubview(subView)
subView.addSubview(collectionView1)
collectionView1.frame = CGRect(x: subView.bounds.origin.x, y: 0, width: subView.bounds.width,height: subView.bounds.height)
myPageNo -= 0
}
if myPageNo == 2{
frame = CGRect(x: scrollWidth * 2 - 20, y: 0, width: scrollWidth,height: scrollHeight)
let subView = UIView(frame: frame)
self.scrollView.addSubview(subView)
subView.addSubview(collectionView2)
collectionView2.frame = CGRect(x: subView.bounds.origin.x, y: 0, width: subView.bounds.width,height: subView.bounds.height)
myPageNo -= 1
}
}
func setIndiactorForCurrentPage() {
let page = (scrollView?.contentOffset.x)!/scrollWidth
print(scrollView?.contentOffset.x ?? 0)
pageControl?.currentPage = Int(page.rounded())
myPageNo = Int(page.rounded())
if myPageNo == 1 {
setFrame(pageNo: 1)
}
if myPageNo == 2{
setFrame(pageNo: 2)
}
}
func setFrame(pageNo: Int){
if(pageNo == 1){
frame = CGRect(x: scrollWidth + 2, y: 0, width: scrollWidth - 40,height: scrollHeight)
let subView = UIView(frame: frame)
scrollView?.addSubview(subView)
subView.addSubview(collectionView1)
collectionView1.frame = CGRect(x: subView.bounds.origin.x, y: 0, width: subView.bounds.width,height: subView.bounds.height)
}
else if(pageNo == 2){
frame = CGRect(x: scrollWidth * 2, y: 0, width: scrollWidth,height: scrollHeight)
let subView = UIView(frame: frame)
scrollView?.addSubview(subView)
subView.addSubview(collectionView2)
collectionView2.frame = CGRect(x: subView.bounds.origin.x, y: 0, width: subView.bounds.width,height: subView.bounds.height)
}
}
当我从上一页返回到上一页时,一切都很好,但当我从第一页转到下一个视图时,我无法处理显示下一个视图边缘的问题
但这不是我想要的。我想用点击手势控制uiscroll,还想用左对齐显示最后一页
`这是我的代码func ScrollViewDiEndDecelling(scrollView:UIScrollView){
`如果您有很多页面,我不会使用scroll view,但下面是我的示例代码,用于在scroll view中显示下一页
class ExampleViewController: UIViewController {
var scrollView = UIScrollView()
var container1 = UIView()
var container2 = UIView()
var container3 = UIView()
override func viewDidLoad() {
super.viewDidLoad()
scrollView.isPagingEnabled = true
scrollView.clipsToBounds = false
view.addSubview(scrollView)
container1.backgroundColor = .red
container2.backgroundColor = .blue
container3.backgroundColor = .yellow
scrollView.addSubview(container1)
scrollView.addSubview(container2)
scrollView.addSubview(container3)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
scrollView.frame = CGRect(x: 0, y: 0, width: view.bounds.width - peekAmount, height: view.bounds.height)
scrollView.contentSize = CGSize(width: 3 * scrollView.frame.width, height: scrollView.frame.size.height)
container1.frame.size = containerSize
container2.frame.size = containerSize
container3.frame.size = containerSize
var xPosition: CGFloat = 0
container1.frame.origin = CGPoint(x: xPosition, y: 0)
xPosition = container1.frame.maxX
container2.frame.origin = CGPoint(x: xPosition, y: 0)
xPosition = container2.frame.maxX
container3.frame.origin = CGPoint(x: xPosition, y: 0)
}
var containerSize: CGSize {
return CGSize(width: scrollView.frame.size.width, height: scrollView.frame.size.height)
}
var peekAmount: CGFloat {
return 80
}
}
有许多不同的方法可以满足您的需求,但这很简单,可以给您一个想法。我没有添加页面控件,因为您已经有了逻辑。我已经在几个项目中工作,您可能希望查看下一个可以查看的项目。最好的解决方案可能是UICollectionView,因为您不会加载它每个UIViewController都会立即进入视图,但只有当它几乎启动时才会进入视图。UICollectionView的单元格重用解决了这一问题 确保单元格大小(您可以根据屏幕大小计算)类似于宽度-40px,这样您就可以看到下一个单元格的边缘。在每个单元格中都有UIViewController是完全可能的,事实上,现在您甚至可以通过Interface Builder来实现 UICollectionView已经实现了UIScrollView,因此无需手动处理UIScrollView。您需要做的唯一一件事是,当有人停止滚动时,您可以决定要滚动到哪个单元格(下一个单元格或保持在当前单元格)并滚动到该单元格。为此,您需要添加手势识别器: 然后滚动到用户停止滚动时最可见的单元格: 为此,您需要知道此时哪个单元格最显眼。此计算可能有点困难,但要点是您需要知道哪些单元格位于
indexPathsForVisibleItems
中,然后根据其内容或滚动偏移量查看哪个单元格比其他单元格更显眼。该文件的indexPath应该是要滚动到视图中的文件的indexPath
此解决方案可扩展到数百万项,因为您只加载实际(即将)加载的单元格请参阅。我想,您可以使用UICollectionView来显示下一个视图的边缘。我非常感谢您的支持,请让我进一步了解这一点,哪种方法最适合获取此内容。我真的应该使用三个单元格(三页)的collection view吗在每个单元格内,我可以使用另一个包含多个单元格的集合视图吗?@IrfanAhmed是的。如果我是你,我肯定会在你的问题的链接中实现设计。你最终会创建一个自定义UICollectionViewFlowLayout来实现滚动行为。你有任何代码可以通过集合视图完成此任务吗?比谢谢你的回答:)我真的很感激你的建议,我实现了你上面的建议,但是我在集合视图单元格中的集合视图不能正常工作。集合视图的第一行是隐藏的,我设置了单元格和集合视图边缘,但没有什么可以正常工作。你能添加一个例子说明你的情况吗?你可以添加.gifs f例如,也可能是视频。我注意到您没有使用
indexPathsForVisibleItems
或方法将单元格滚动到视图中。您将确切知道您在哪个页面上,因为您刚刚确定了您捕捉到的是哪个indexPath单元格。实际上,我的第一个集合视图的单元格宽度等于colleAction view width-35显示下一个项目的边缘,在这三个单元格中,我添加了另一个包含27个7个项目的集合视图,因此第一件事是当我进入下一页时,我的第一个集合视图单元格在屏幕后面一点,当我想获得可见单元格索引时,我得到了第二个集合视图项目的索引,它是子vi第一个单元格的ew。我真的看不出来。你已经看了视图层次结构了吗?:-我的直觉是,你嵌套在单元格中的VC仍然有其原始大小,而不是宽度-35。layoutSubviews
在设置它们之后可能会有所帮助。你是使用约束还是手动调整所有内容的大小?我使用的是cons列车