swift 定位中心 UICollectionViewCell
swift positionate center UICollectionViewCell
我正在尝试实现“快速生效”但无法正常工作,是不是我做错了什么?
继承 UICollectionViewFlowLayout
并覆盖 targetContentOffsetForProposedContentOffset
函数:
override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
var offsetAdjustment:CGFloat = CGFloat(MAXFLOAT)
let verticalCenter:CGFloat = proposedContentOffset.y + (CGRectGetHeight(self.collectionView!.bounds) / 2.0)
let proposedRect:CGRect = CGRectMake(proposedContentOffset.x,0.0,self.collectionView!.bounds.size.width,self.collectionView!.bounds.size.height)
let array:NSArray = self.layoutAttributesForElementsInRect(proposedRect)!
for layoutAttributes : AnyObject in array {
if let _layoutAttributes = layoutAttributes as? UICollectionViewLayoutAttributes {
if _layoutAttributes.representedElementCategory != UICollectionElementCategory.Cell {
continue
}
let itemVerticalCenter:CGFloat = layoutAttributes.center.y
let _verticalCenter = fabsf(Float(itemVerticalCenter) - Float(verticalCenter))
let _offsetAdjustment = fabsf(Float(offsetAdjustment))
if (_verticalCenter < _offsetAdjustment) {
offsetAdjustment = itemVerticalCenter - verticalCenter
}
}
}
return CGPointMake(proposedContentOffset.x + offsetAdjustment, proposedContentOffset.y)
}
我终于找到了
override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
let rectBounds:CGRect = self.collectionView!.bounds
let halfHeight:CGFloat = rectBounds.size.height * CGFloat(0.45)
let proposedContentOffsetCenterY:CGFloat = proposedContentOffset.y + halfHeight
let attributesArray:NSArray = self.layoutAttributesForElementsInRect(rectBounds)!
var candidateAttributes:UICollectionViewLayoutAttributes?
for layoutAttributes : AnyObject in attributesArray {
if let _layoutAttributes = layoutAttributes as? UICollectionViewLayoutAttributes {
if _layoutAttributes.representedElementCategory != UICollectionElementCategory.Cell {
continue
}
if candidateAttributes == nil {
candidateAttributes = _layoutAttributes
self.delegate?.cellCenteredAtIndexPathWithCollectionView(self.collectionView!, layout: self, indexPath: candidateAttributes!.indexPath)
continue
}
if fabsf(Float(_layoutAttributes.center.y) - Float(proposedContentOffsetCenterY)) < fabsf(Float(candidateAttributes!.center.y) - Float(proposedContentOffsetCenterY)) {
candidateAttributes = _layoutAttributes
self.delegate?.cellCenteredAtIndexPathWithCollectionView(self.collectionView!, layout: self, indexPath: candidateAttributes!.indexPath)
}
}
}
if attributesArray.count == 0 {
return CGPointMake(proposedContentOffset.x,proposedContentOffset.y - halfHeight * 2)
}
return CGPointMake(proposedContentOffset.x,candidateAttributes!.center.y - halfHeight)
}
另外不要忘记设置委托:
class MyCostomFlow: UICollectionViewFlowLayout, UICollectionViewDelegateFlowLayout {
var delegate:MyFlowLayoutDelegate?
}
和代表本身:
protocol MyFlowLayoutDelegate
{
func cellCenteredAtIndexPathWithCollectionView(collectionView: UICollectionView, layout: UICollectionViewLayout, indexPath: NSIndexPath) -> Void
}
我正在尝试实现“快速生效”但无法正常工作,是不是我做错了什么?
继承 UICollectionViewFlowLayout
并覆盖 targetContentOffsetForProposedContentOffset
函数:
override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
var offsetAdjustment:CGFloat = CGFloat(MAXFLOAT)
let verticalCenter:CGFloat = proposedContentOffset.y + (CGRectGetHeight(self.collectionView!.bounds) / 2.0)
let proposedRect:CGRect = CGRectMake(proposedContentOffset.x,0.0,self.collectionView!.bounds.size.width,self.collectionView!.bounds.size.height)
let array:NSArray = self.layoutAttributesForElementsInRect(proposedRect)!
for layoutAttributes : AnyObject in array {
if let _layoutAttributes = layoutAttributes as? UICollectionViewLayoutAttributes {
if _layoutAttributes.representedElementCategory != UICollectionElementCategory.Cell {
continue
}
let itemVerticalCenter:CGFloat = layoutAttributes.center.y
let _verticalCenter = fabsf(Float(itemVerticalCenter) - Float(verticalCenter))
let _offsetAdjustment = fabsf(Float(offsetAdjustment))
if (_verticalCenter < _offsetAdjustment) {
offsetAdjustment = itemVerticalCenter - verticalCenter
}
}
}
return CGPointMake(proposedContentOffset.x + offsetAdjustment, proposedContentOffset.y)
}
我终于找到了
override func targetContentOffsetForProposedContentOffset(proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
let rectBounds:CGRect = self.collectionView!.bounds
let halfHeight:CGFloat = rectBounds.size.height * CGFloat(0.45)
let proposedContentOffsetCenterY:CGFloat = proposedContentOffset.y + halfHeight
let attributesArray:NSArray = self.layoutAttributesForElementsInRect(rectBounds)!
var candidateAttributes:UICollectionViewLayoutAttributes?
for layoutAttributes : AnyObject in attributesArray {
if let _layoutAttributes = layoutAttributes as? UICollectionViewLayoutAttributes {
if _layoutAttributes.representedElementCategory != UICollectionElementCategory.Cell {
continue
}
if candidateAttributes == nil {
candidateAttributes = _layoutAttributes
self.delegate?.cellCenteredAtIndexPathWithCollectionView(self.collectionView!, layout: self, indexPath: candidateAttributes!.indexPath)
continue
}
if fabsf(Float(_layoutAttributes.center.y) - Float(proposedContentOffsetCenterY)) < fabsf(Float(candidateAttributes!.center.y) - Float(proposedContentOffsetCenterY)) {
candidateAttributes = _layoutAttributes
self.delegate?.cellCenteredAtIndexPathWithCollectionView(self.collectionView!, layout: self, indexPath: candidateAttributes!.indexPath)
}
}
}
if attributesArray.count == 0 {
return CGPointMake(proposedContentOffset.x,proposedContentOffset.y - halfHeight * 2)
}
return CGPointMake(proposedContentOffset.x,candidateAttributes!.center.y - halfHeight)
}
另外不要忘记设置委托:
class MyCostomFlow: UICollectionViewFlowLayout, UICollectionViewDelegateFlowLayout {
var delegate:MyFlowLayoutDelegate?
}
和代表本身:
protocol MyFlowLayoutDelegate
{
func cellCenteredAtIndexPathWithCollectionView(collectionView: UICollectionView, layout: UICollectionViewLayout, indexPath: NSIndexPath) -> Void
}