我正在尝试创建带有分页的UICollectionView,并且每个项目的最大宽度为250点,我已经设法创建了它,但是我遇到了两个问题:第一个项目开始时不正确,但是开始时有更多空间当我尝试滑动时,总会有一些东西无法让我平稳滑动。
看起来是这样的:
影片连结
这是我的代码:
CenterCellCollectionFlowLayout.swift
class CenterCellCollectionViewFlowLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElementsInRect(rect: CGRect) -> [AnyObject]? {
var attributesToReturn:[UICollectionViewLayoutAttributes] = super.layoutAttributesForElementsInRect(rect) as! [UICollectionViewLayoutAttributes]
for var i = 0 ; i < attributesToReturn.count ; i++
{
var currentLayoutAttributes: UICollectionViewLayoutAttributes = attributesToReturn[i]
var maximumSpacing: CGFloat = 50
let origin: CGFloat
if i - 1 >= 0 {
let previousLayoutAttributes = attributesToReturn[i - 1]
origin = previousLayoutAttributes.frame.maxX
} else {
origin = 0
}
if origin + maximumSpacing + currentLayoutAttributes.frame.size.width < self.collectionViewContentSize().width
{
var frame: CGRect = currentLayoutAttributes.frame
frame.origin.x = origin + maximumSpacing
currentLayoutAttributes.frame = frame
}
}
return attributesToReturn
}
override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
if let cv = self.collectionView {
let cvBounds = cv.bounds
let halfWidth = cvBounds.size.width * 0.5;
let proposedContentOffsetCenterX = proposedContentOffset.x + halfWidth;
if let attributesForVisibleCells = self.layoutAttributesForElementsInRect(cvBounds) as? [UICollectionViewLayoutAttributes] {
var candidateAttributes : UICollectionViewLayoutAttributes?
for attributes in attributesForVisibleCells {
// == Skip comparison with non-cell items (headers and footers) == //
if attributes.representedElementCategory != UICollectionElementCategory.Cell {
continue
}
if let candAttrs = candidateAttributes {
let a = attributes.center.x - proposedContentOffsetCenterX
let b = candAttrs.center.x - proposedContentOffsetCenterX
if fabsf(Float(a)) < fabsf(Float(b)) {
candidateAttributes = attributes;
}
}
else { // == First time in the loop == //
candidateAttributes = attributes;
continue;
}
}
return CGPoint(x : candidateAttributes!.center.x - halfWidth, y : proposedContentOffset.y);
}
}
// Fallback
return super.targetContentOffsetForProposedContentOffset(proposedContentOffset)
}
}
MainViewController.swift
class MainViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {
@IBOutlet weak var collectionView: UICollectionView!
@IBOutlet weak var collectionViewFlowLayout: CenterCellCollectionViewFlowLayout!
var collectionObjects: NSMutableArray?
private let reuseIdentifier = "CollectionViewCell"
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)
{
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell
{
let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! UICollectionViewCell
cell.backgroundColor = UIColor.greenColor()
// Configure the cell
return cell
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
{
return 10
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets
{
return UIEdgeInsetsMake(0, 0, 0, 0)
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
{
return CGSizeMake(250, 250)
}
}
提前致谢
所以我想出了办法。
首先创建一个自定义UICollectionViewFlowLayout并添加此重写此方法:
override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
if let cv = self.collectionView {
let cvBounds = cv.bounds
let halfWidth = cvBounds.size.width * 0.5;
let proposedContentOffsetCenterX = proposedContentOffset.x + halfWidth;
if let attributesForVisibleCells = self.layoutAttributesForElementsInRect(cvBounds) as? [UICollectionViewLayoutAttributes] {
var candidateAttributes : UICollectionViewLayoutAttributes?
for attributes in attributesForVisibleCells {
// == Skip comparison with non-cell items (headers and footers) == //
if attributes.representedElementCategory != UICollectionElementCategory.Cell {
continue
}
if let candAttrs = candidateAttributes {
let a = attributes.center.x - proposedContentOffsetCenterX
let b = candAttrs.center.x - proposedContentOffsetCenterX
if fabsf(Float(a)) < fabsf(Float(b)) {
candidateAttributes = attributes;
}
}
else { // == First time in the loop == //
candidateAttributes = attributes;
continue;
}
}
return CGPoint(x : candidateAttributes!.center.x - halfWidth, y : proposedContentOffset.y);
}
}
// Fallback
return super.targetContentOffsetForProposedContentOffset(proposedContentOffset)
}
然后在实现UICollectionView的类上执行以下操作:
let collectionViewLayout: CenterCellCollectionViewFlowLayout = CenterCellCollectionViewFlowLayout()
collectionViewLayout.itemSize = CGSizeMake(self.itemSize, self.itemSize)
collectionViewLayout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
collectionViewLayout.minimumInteritemSpacing = 0
collectionViewLayout.minimumLineSpacing = self.itemSpacing
collectionViewLayout.scrollDirection = UICollectionViewScrollDirection.Horizontal
var collectionView: UICollectionView = UICollectionView(frame: self.collectionContainer.bounds, collectionViewLayout: collectionViewLayout)
collectionView.delegate = self;
collectionView.dataSource = self;
collectionView.backgroundColor = UIColor.redColor()
collectionView.registerClass(LevelsCustomCell.self, forCellWithReuseIdentifier: reuseIdentifier)
collectionView.registerNib(UINib(nibName: reuseIdentifier, bundle: nil), forCellWithReuseIdentifier: reuseIdentifier)
self.collectionContainer.addSubview(collectionView)
就是这样,就像一个魅力。
我读到DB2不支持限制和偏移量。我还读到您必须使用ROW_NUMBER()和子查询来获得所需的结果。如果这是SQL查询: 其中$offset是偏移量,$rowserPage是我希望在页面上显示的数据库行的数量,这可以等效为DB2查询。
问题内容: 我有在Objective-C中创建和NSAlert的代码,但是现在我想在Swift中创建它。 该警报是为了确认用户要删除文档。 我希望“删除”按钮可以运行删除功能,而“取消”按钮只是为了消除警报。 如何在Swift中编写此代码? 问题答案: 在OS X 10.10 Yosemite中已弃用。 迅捷2 返回或根据用户的选择。 表示添加到对话框的第一个按钮,此处为“确定”。 迅捷3 斯威夫
我需要创建一个带有分页的HTML表。数据来自两个不同的来源(可能是来自两个不同数据库的两个表,比如一个Oracle,另一个是MySQL),您不能使用JOIN select语句。为了使它更复杂,我需要以升序显示按时间戳排序的数据(其中一个属性是timestamp)。 例如,源A有45条记录,源B有55条记录。因此,该表将显示总共100条记录,但一次只显示15条记录。因此必须有7页(6页15条记录,1
主要内容:HTML 代码接下来我们通过 Bootstrap3 来创建一个简单的响应式网页。 在学习之前我们可以先看下效果:https://www.xnip.cn/try/demo_source/bootstrap3-makewebsite.htm HTML 代码 <div class="jumbotron text-center" style="margin-bottom:0"> <h1>我的第一个 Bootstrap
主要内容:HTML 代码接下来我们通过 Bootstrap4 来创建一个简单的响应式网页。 在学习之前我们可以先看下效果:https://www.xnip.cn/try/demo_source/bootstrap3-makewebsite.htm HTML 代码 <div class="jumbotron text-center" style="margin-bottom:0"> <h1>我的第一个 Bootstrap
我正在使用H2-Database和Spring-Data PagingRepository。我喜欢使用分页并从数据库中选择html字段包含“@”或“[at]”或“(at)”或“mail”的所有文章... 因此,没有分页的本机查询如下所示 我试图这样解决它: 但是没有/空的结果。 我尝试的第二种方法是使用本机查询: 但我有个例外: 嵌套异常org.hibernate.exception.SQLGra