- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
现在我有一个总是从第一个元素开始的 Collection View ,但我希望用户完成关卡,一旦他们完成, Collection View 应该从第二个元素开始,如下图所示。
一段时间后,当关卡完成时,从第二个元素开始,如下所示:
你知道怎么做吗?到目前为止,我已经做到了这一点。
public protocol SnapLikeDataDelegate: class {
func cellSelected(_ index: Int)
}
public class SnapLikeDataSource<Cell: UICollectionViewCell>: NSObject, UICollectionViewDelegate, UICollectionViewDataSource where Cell: SnapLikeCell {
enum NearestPointDirection: Int {
case any
case left
case right
}
private var scrollVelocity: CGFloat = 0.0
private var selectedItem: Int = 0
public weak var delegate: SnapLikeDataDelegate?
public var items: [Cell.Item] = []
public var images: [Cell.Image] = []
private let selectionFB = UISelectionFeedbackGenerator()
private weak var collectionView: UICollectionView?
private var collectionViewCenter: CGFloat
private let cellSize: SnapLikeCellSize
public init(collectionView: UICollectionView, cellSize: SnapLikeCellSize) {
self.collectionView = collectionView
self.collectionViewCenter = collectionView.bounds.width / 2
self.cellSize = cellSize
}
// MARK: - Animation:
public func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
if self.selectedItem == Int.max { return }
let previousSelectedIndex: Int = selectedItem
// add a placeholder value for selectedItem while scrolling
selectedItem = Int.max
reloadCell(at: IndexPath(item: previousSelectedIndex, section: 0), withSelectedState: false)
}
public func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
scrollVelocity = velocity.x
if scrollVelocity == 0 {
targetContentOffset.pointee = offset(forCenterX: targetContentOffset.pointee.x + collectionViewCenter, with: .any)
}
if scrollVelocity < 0 {
targetContentOffset.pointee = offset(forCenterX: targetContentOffset.pointee.x + collectionViewCenter, with: .left)
} else if scrollVelocity > 0 {
targetContentOffset.pointee = offset(forCenterX: targetContentOffset.pointee.x + collectionViewCenter, with: .right)
}
}
public func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
reloadCell(at: IndexPath(item: selectedItem, section: 0), withSelectedState: true)
selectionFB.selectionChanged()
delegate?.cellSelected(selectedItem)
}
/// Reload cell so it becomes selected or unselected
public func reloadCell(at indexPath: IndexPath, withSelectedState selected: Bool) {
if let cell = collectionView?.cellForItem(at: indexPath) {
cell.isSelected = selected
}
}
public func selectItem(_ indexPath: IndexPath) {
perform(#selector(collectionView(_:didSelectItemAt:)),
with: collectionView,
with: indexPath)
}
// Calculate the offset to the center from the nearest cell
func offset(forCenterX centerX: CGFloat, with direction: NearestPointDirection) -> CGPoint {
let leftNearestCenters = nearestLeftCenter(forCenterX: centerX)
let leftCenterIndex: Int = leftNearestCenters.index
let leftCenter: CGFloat = leftNearestCenters.value
let rightNearestCenters = nearestRightCenter(forCenterX: centerX)
let rightCenterIndex: Int = rightNearestCenters.index
let rightCenter: CGFloat = rightNearestCenters.value
var nearestItemIndex: Int = Int.max
switch direction {
case .any:
if leftCenter > rightCenter {
nearestItemIndex = rightCenterIndex
} else {
nearestItemIndex = leftCenterIndex
}
case .left:
nearestItemIndex = leftCenterIndex
case .right:
nearestItemIndex = rightCenterIndex
}
selectedItem = nearestItemIndex
return CGPoint(x: CGFloat(nearestItemIndex) * cellSize.normalWidth, y: 0.0)
}
/// Getting the nearest cell attributes on the left
func nearestLeftCenter(forCenterX centerX: CGFloat) -> (index: Int, value: CGFloat) {
let nearestLeftElementIndex: CGFloat = (centerX - collectionViewCenter - cellSize.centerWidth + cellSize.normalWidth) / cellSize.normalWidth
let minimumLeftDistance: CGFloat = centerX - nearestLeftElementIndex * cellSize.normalWidth - collectionViewCenter - cellSize.centerWidth + cellSize.normalWidth
return (Int(nearestLeftElementIndex), minimumLeftDistance)
}
/// Getting the nearest cell attributes on the right
func nearestRightCenter(forCenterX centerX: CGFloat) -> (index: Int, value: CGFloat) {
let nearestRightElementIndex: Int = Int(ceilf(Float((centerX - collectionViewCenter - cellSize.centerWidth + cellSize.normalWidth) / cellSize.normalWidth)))
let minimumRightDistance: CGFloat = CGFloat(nearestRightElementIndex) * cellSize.normalWidth + collectionViewCenter - centerX - cellSize.centerWidth + cellSize.normalWidth
return (nearestRightElementIndex, minimumRightDistance)
}
// MARK : - Delegate
@objc public func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
collectionView.deselectItem(at: indexPath, animated: false)
scrollViewWillBeginDragging(collectionView)
selectedItem = indexPath.item
let layout = collectionView.collectionViewLayout as! SnapLikeCollectionViewFlowLayout
let x: CGFloat = CGFloat(selectedItem) * cellSize.normalWidth
layout.ignoringBoundsChange = true
collectionView.setContentOffset(CGPoint(x: x, y: 0), animated: true)
layout.ignoringBoundsChange = false
perform(#selector(self.scrollViewDidEndDecelerating), with: collectionView, afterDelay: 0.3)
}
public func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return items.count
}
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: Cell.self), for: indexPath) as! Cell
cell.item = items[indexPath.item]
cell.image = images[indexPath.item]
return cell
}
在我的 View Controller 中,我这样做:
var logoImage: [UIImage] = [
UIImage(named: "1") ?? UIImage(named: "1")!,
UIImage(named: "2") ?? UIImage(named: "1")!,
UIImage(named: "3") ?? UIImage(named: "1")!,
UIImage(named: "2") ?? UIImage(named: "1")!,
UIImage(named: "1") ?? UIImage(named: "1")!
]
dataSource?.items = ["1", "2", "3", "4", "F"]
dataSource?.images = logoImage
最佳答案
我使用了这个函数:
collectionView.scrollToItem(at: IndexPath(item: 3, section: 0), at: [], animated: false)
它起作用了,一旦应用程序启动,CollectionView 就会显示项目集中的第三个元素。
关于swift - collectionView中如何从第二个item开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55024891/
有没有办法在 .swift 文件(编译成 .swift 模块)中声明函数,如下所示: 你好.swift func hello_world() { println("hello world")
我正在尝试使用 xmpp_messenger_ios 和 XMPPFramework 在 iOS 上执行 MUC 这是加入房间的代码。 func createOrJoinRoomOnXMPP()
我想在我的应用程序上创建一个 3D Touch 快捷方式,我已经完成了有关快捷方式本身的所有操作,它显示正确,带有文本和图标。 当我运行这个快捷方式时,我的应用程序崩溃了,因为 AppDelegate
我的代码如下: let assetTag = Expression("asset_tag") let query2 = mdm.select(mdm[assetTag],os, mac, lastRe
我的 swift 代码如下所示 Family.arrayTuple:[(String,String)]? = [] Family.arrayTupleStorage:String? Family.ar
这是我的 JSON,当我读取 ord 和 uniq 数据时出现错误 let response2 : [String: Any] = ["Response":["status":"SUCCESS","
我想将 swift 扩展文件移动到 swift 包中。但是,将文件移动到 swift 包后,我遇到了这种错误: "Type 'NSAttributedString' has no member 'ma
使用CocoaPods,我们可以设置以下配置: pod 'SourceModel', :configurations => ['Debug'] 有什么方法可以用 Swift Package Manag
我正在 Xcode 中开发一个 swift 项目。我将其称为主要项目。我大部分都在工作。我在日期选择器、日期范围和日期数学方面遇到了麻烦,因此我开始了另一个名为 StarEndDate 的项目,其中只
这是 ObjectiveC 代码: CCSprite *progress = [CCSprite spriteWithImageNamed:@"progress.png"]; mProgressBar
我正在创建一个命令行工具,在 Xcode 中使用 Swift。我想使用一个类似于 grunt 的配置文件确实如此,但我希望它是像 Swift 包管理器的 package.swift 文件那样的快速代码
我假设这意味着使用系统上安装的任何 swift 运行脚本:#!/usr/bin/swift 如何指定脚本适用的解释器版本? 最佳答案 Cato可用于此: #!/usr/bin/env cato 1.2
代码说完全没问题,没有错误,但是当我去运行模拟器的时候,会出现这样的字样: (Swift.LazyMapCollection (_base:[ ] 我正在尝试创建一个显示报价的报价应用。 这是导入
是否可以在运行 Swift(例如 Perfect、Vapor、Kitura 等)的服务器上使用 RealmSwift 并使用它来存储数据? (我正在考虑尝试将其作为另一种解决方案的替代方案,例如 no
我刚开始学习编程,正在尝试完成 Swift 编程书中的实验。 它要求““编写一个函数,通过比较两个 Rank 值的原始值来比较它们。” enum Rank: Int { case Ace = 1 ca
在您将此问题标记为重复之前,我检查了 this question 它对我不起作用。 如何修复这个错误: error: SWIFT_VERSION '5.0' is unsupported, suppo
从 Xcode 9.3 开始,我在我的模型中使用“Swift.ImplicitlyUnwrappedOptional.some”包裹了我的字符串变量 我不知道这是怎么发生的,但它毁了我的应用程序! 我
这个问题在这里已经有了答案: How to include .swift file from other .swift file in an immediate mode? (2 个答案) 关闭 6
我正在使用 Swift Package Manager 创建一个应用程序,我需要知道构建项目的配置,即 Debug 或 Release。我试图避免使用 .xcodeproj 文件。请有人让我知道这是否
有一个带有函数定义的文件bar.swift: func bar() { println("bar") } 以及一个以立即模式运行的脚本foo.swift: #!/usr/bin/xcrun s
我是一名优秀的程序员,十分优秀!