V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  V2SuperUser  ›  全部回复第 2 页 / 共 5 页
回复总数  82
1  2  3  4  5  
根据 https://juejin.cn/post/6940140043042291748 的缩放效果改了一个,你试试效果

```Swift

import UIKit

class ViewController: UIViewController {

private let margin: CGFloat = 20
private var itemW: CGFloat = .zero
private let cellID = "baseCellID"
private let cellCount = 100
private var collectionView: UICollectionView!

override func viewDidLoad() {
super.viewDidLoad()
setUpView()
}

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
}

func setUpView() {
let layout = ZGFlowLayout()
let collH: CGFloat = 200
let itemH = collH - margin * 2
itemW = view.bounds.width - margin * 2 - 100
layout.itemSize = CGSize(width: itemW, height: itemH)
layout.minimumLineSpacing = margin
layout.scrollDirection = .horizontal

collectionView = UICollectionView(frame: CGRect(x: 0, y: 180, width: view.bounds.width, height: collH), collectionViewLayout: layout)
collectionView.backgroundColor = .black
collectionView.showsHorizontalScrollIndicator = false
collectionView.dataSource = self
collectionView.delegate = self

collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cellID)
view.addSubview(collectionView)
scrollTo(index: cellCount/2)
}
}

extension ViewController: UICollectionViewDelegate, UICollectionViewDataSource{

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return cellCount
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellID, for: indexPath)
let colors: [UIColor] = [.red, .yellow, .blue]
cell.backgroundColor = colors[indexPath.item % 3]
return cell
}

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
let scrollStop = !scrollView.isTracking && !scrollView.isDragging && !scrollView.isDecelerating
guard scrollStop else { return }
ZGScrollViewDidEndScroll(scrollView: scrollView)
}

func scrollViewDidScroll(_ scrollView: UIScrollView) {
//防止滚动到最后或者最前,如果觉得改变时突兀,可以增加 cellCount
let page = getCurrentPage(scrollView: scrollView)
if page >= 95 || page <= 5 {
scrollTo(index: page%3 + cellCount+1)
}
}

private func ZGScrollViewDidEndScroll(scrollView: UIScrollView) {
let page = getCurrentPage(scrollView: scrollView)
scrollTo(index: page%3 + cellCount+1)
}

private func scrollTo(index: Int){
collectionView.scrollToItem(at: IndexPath(item: index, section: 0), at: .centeredHorizontally, animated: false)
}

private func getCurrentPage(scrollView: UIScrollView) -> Int{
//第一个 page 偏移量会少了多显示出来的一半,不使用之后的计算,直接判定为 0
var page: CGFloat = 0
if scrollView.contentOffset.x > 0 {
//计算单次滑动的偏移量
let scrollW = scrollView.frame.width
//显示的多出一半的宽度
let half = (scrollW - itemW)/2
//除第一个外其余每次滑动的偏移量
let eachOffset = (itemW+margin)
//第一个 cell 的偏移量
let firstOffset = eachOffset-half
page = (scrollView.contentOffset.x-firstOffset)/(eachOffset) + 1
}
return Int(page)
}
}

class ZGFlowLayout: UICollectionViewFlowLayout {

override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attributes = super.layoutAttributesForElements(in: rect)
let centerX = collectionView!.contentOffset.x + collectionView!.bounds.width / 2
attributes?.forEach({ (attr) in
let pad = abs(centerX - attr.center.x)
let factor = 0.0009
let scale = 1 / (1 + pad * CGFloat(factor))
attr.transform = CGAffineTransform(scaleX: scale, y: scale)
})
return attributes
}

override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
var targetPoint = proposedContentOffset
let centerX = proposedContentOffset.x + collectionView!.bounds.width / 2
let attrs = self.layoutAttributesForElements(in: CGRect(x: proposedContentOffset.x, y: proposedContentOffset.y, width: collectionView!.bounds.size.width, height: collectionView!.bounds.size.height))
var moveDistance: CGFloat = CGFloat(MAXFLOAT)
attrs!.forEach { (attr) in
if abs(attr.center.x - centerX) < abs(moveDistance) {
moveDistance = attr.center.x - centerX
}
}
if targetPoint.x > 0 && targetPoint.x < collectionViewContentSize.width - collectionView!.bounds.width {
targetPoint.x += moveDistance
}
return targetPoint
}

override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
}

override var collectionViewContentSize: CGSize {
return CGSize(width: sectionInset.left + sectionInset.right + (CGFloat(collectionView!.numberOfItems(inSection: 0)) * (itemSize.width + minimumLineSpacing)) - minimumLineSpacing, height: 0)
}
}


```
2023-09-07 15:12:54 +08:00
回复了 serafin 创建的主题 Apple Lightning 苹果真的做到了“ 10 年不变”
@chengxiao
@chairuosen

别的我不知道,用 iPhone 十年尾插没坏过,用 typeC 的 iPad Pro 尾插一年前已经换过一次,现在又感觉出问题了,公司的 C to C 插 Mac 充不了电,用对象的 Apple 20w 充电头充不了电,插我家主机上的 C 口可以充电,USBA -C 能充电,就很烦
@LaGeNanRen 我给租赁公司说的一切问题请跟我的保险公司商量,保险公司说只赔修车钱,我主要担心的是时间过去一个多星期了还在清算中,如果到时候真要我出停运费,这个时间是不是越长对我越不利
@cmdOptionKana 是的,他应该是不经常开,我报了保险,勘察都讲清楚了他还是担心不肯让我走,其实就是个很小的事故
以我自己修车经验来看,那个喷漆 300 可以搞定,走保险会高点,也不会超过 2000 ,所以我给保险公司说如果对方修车不超过 2000 直接交强险,我的车就不用修,超过 2000 我就修我自己的车走商业险,我车子就中网和前杠裂开一点点,修不修都无所谓那种
对方误以为闪烁提示减速的灯是红灯直接刹停,我看到不对劲也刹车了一段距离,路滑实在停不下来,干地应该没问题,车子科鲁泽,开车的说 200+一天租的,受损不严重,就后杠掉点漆,都没变形,租车公司要我出停运费我没给,走了保险,一个多星期了还在清算中,也没任何人再联系过我
2023-08-16 11:23:50 +08:00
回复了 CHENYIMING 创建的主题 问与答 iPhone 14Pro 发布一年了,你们的续航怎么样?
去年 12 月官网购入 14pro 现在还是 100%看了下屏幕使用时间日均 4 小时
对于我来说,不是我不想要,是我要不起,不敢要
2023-06-19 10:10:06 +08:00
回复了 ChrisFreeMan 创建的主题 生活 住在小学旁边,没个降噪耳机真的活不下去。
@billzhuang 堂下何人状告本官?
2023-06-15 12:41:31 +08:00
回复了 PrtScScrLk 创建的主题 生活 预约了一次提前还贷。
还钱还得排队真是搞笑
2023-05-31 10:09:59 +08:00
回复了 chenfcheng 创建的主题 上海 有打算在上海市区买低于 300 的老破小吗
@findmyself 我也想不明白,即使不卖,多花的钱也在那里啊,现在还在降的趋势,等平滑了再买能省下不少钱
2023-04-25 15:20:54 +08:00
回复了 meisen 创建的主题 iPhone 大胆预测: iOS 17 支持右侧返回
@V2SuperUser 纠错 滑动返回
2023-04-25 15:20:13 +08:00
回复了 meisen 创建的主题 iPhone 大胆预测: iOS 17 支持右侧返回
@meisen iOS 默认开启页面左侧滑动返回,如果 APP 开发者在页面取消了 navigationController.interactivePopGestureRecognizer.delegate 那么花朵返回的功能会失效
2023-03-06 17:24:23 +08:00
回复了 Chad0000 创建的主题 V2EX 付费改名调查
我感觉我这还行😆
2023-02-28 14:44:19 +08:00
回复了 ggp1ot2 创建的主题 Apple mac 上有没有什么类似扫描全能王之类的软件
iPhone 、iPad 长按备忘录,选择扫描文稿,接力 mac 上编辑
1  2  3  4  5  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3018 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 29ms · UTC 13:42 · PVG 21:42 · LAX 05:42 · JFK 08:42
Developed with CodeLauncher
♥ Do have faith in what you're doing.