gpt4 book ai didi

ios - 如何使用 UIScrollView 显示下一个 View 的边缘

转载 作者:可可西里 更新时间:2023-11-01 02:01:41 32 4
gpt4 key购买 nike

this things that i want to get

我是 ios 开发的新手,我想使用 scrollview initial 显示下一个 View 的边缘我从这个 Link 得到了帮助,这是我的 View 层次结构1)我从 Storyboard添加了 ScrollView 来查看 Controller 的顶 View 2) 我以编程方式添加了一个 View 作为容器 View 和 Collection View 作为 ScrollView 的 subview 。

我显示了下一个 View 的边缘,但是当我转到下一页时,事情并不顺利,我不知道如何处理这个庞大的事情,而且我也不知道哪种方法最适合完成这个特定任务。这是我的代码。我真的被困住了,我真的不知道该怎么办。

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)

}
}

当我从最后一页返回到上一页时,一切都很好,但是当我转到第一页到下一个 View 时,我无法处理显示下一个 View 的边缘。

So far I achieved this thing但这不是我想要的。我想使用点击手势控制 uiscroll 并且还想显示左对齐的最后一页`这是我的代码 func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {

    var visibleRect = CGRect()
visibleRect.origin = collectionView.contentOffset
visibleRect.size = collectionView.bounds.size
let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
let visibleIndexPath: IndexPath = collectionView.indexPathForItem(at: visiblePoint)

collectionView.scrollToItem(at: visibleIndexPath, at: .left, animated: true)
indexPathArray.removeAll()
}

`

最佳答案

我一直在从事几个项目,您可能会想看看下一个可以查看的项目。最好的解决方案可能是 UICollectionView,因为您不会立即将每个 UIViewController 加载到 View 中,而是仅在它快要启动时才加载。 UICollectionView 的单元格重用可以解决这个问题。

确保单元格大小(您可以根据屏幕大小计算)类似于 width - 40px 这样您就可以看到下一个单元格的边缘。完全有可能在每个单元格中都有一个 UIViewController,事实上,现在您甚至可以通过 Interface Builder 来实现。

UICollectionView 已经实现了 UIScrollView,因此无需手动修改 UIScrollView。您唯一需要做的是,在有人停止滚动的那一刻,您决定要滚动到哪个单元格(下一个或留在当前单元格)并滚动到该单元格动画。为此,您需要添加一个手势识别器: Intercepting pan gestures over a UIScrollView breaks scrolling

然后滚动到用户停止滚动时最明显的单元格: https://developer.apple.com/documentation/uikit/uicollectionview/1618046-scrolltoitematindexpath

为此,您需要知道当时哪个单元格最可见。这个计算可能有点困难,但要点是您需要知道 indexPathsForVisibleItems 中有哪些单元格,然后根据它们的内容或 scrollOffset 查看哪个单元格比其他单元格更可见.那个的 indexPath 应该是您要滚动到 View 中的那个的 indexPath。

此解决方案可扩展到数百万个项目,因为您只加载您实际(即将)看到的单元格。

关于ios - 如何使用 UIScrollView 显示下一个 View 的边缘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45822846/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com