我一直在複製2013年WWDC會話217「探索iOS 7上的滾動視圖」。我使用的是Xcode 7 beta 2,我的項目只有iOS 9。UIDynamicAnimator +自定義UICollectionViewLayout導致永久性圓周運動
我正在嘗試使用UIDynamicAnimator
與我的UICollectionViewLayout
以類似於會話217中呈現的方式來模仿Messages.app的感覺。我的UICollectionViewLayout
是一個自定義的,由於某種原因,我的細胞似乎在我的項目中以圓周運動反彈。
下面是問題的video更清晰。
這是我的自定義佈局代碼。
// Didn't write this code myself, but should be pretty simple to follow. @Goles
#import "VVSpringCollectionViewFlowLayout.h"
@interface VVSpringCollectionViewFlowLayout()
@property (nonatomic, strong) UIDynamicAnimator *animator;
@end
@implementation VVSpringCollectionViewFlowLayout
-(id)init {
if (self = [super init]) {
_springDamping = 0.5;
_springFrequency = 0.8;
_resistanceFactor = 500;
}
return self;
}
- (id)initWithCoder:(nonnull NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
_springDamping = 0.5;
_springFrequency = 0.8;
_resistanceFactor = 500;
}
return self;
}
-(void)prepareLayout {
[super prepareLayout];
if (!_animator) {
_animator = [[UIDynamicAnimator alloc] initWithCollectionViewLayout:self];
CGSize contentSize = [self collectionViewContentSize];
NSArray *items = [super layoutAttributesForElementsInRect:CGRectMake(0, 0, contentSize.width, contentSize.height)];
for (UICollectionViewLayoutAttributes *item in items) {
UIAttachmentBehavior *spring = [[UIAttachmentBehavior alloc] initWithItem:item attachedToAnchor:item.center];
spring.length = 0;
spring.damping = self.springDamping;
spring.frequency = self.springFrequency;
[_animator addBehavior:spring];
}
}
}
-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
return [_animator itemsInRect:rect];
}
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {
return [_animator layoutAttributesForCellAtIndexPath:indexPath];
}
-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
UIScrollView *scrollView = self.collectionView;
CGFloat scrollDelta = newBounds.origin.y - scrollView.bounds.origin.y;
CGPoint touchLocation = [scrollView.panGestureRecognizer locationInView:scrollView];
for (UIAttachmentBehavior *spring in _animator.behaviors) {
CGPoint anchorPoint = spring.anchorPoint;
CGFloat distanceFromTouch = fabs(touchLocation.y - anchorPoint.y);
CGFloat scrollResistance = distanceFromTouch/self.resistanceFactor;
id<UIDynamicItem> item = [spring.items firstObject];
CGPoint center = item.center;
if (scrollDelta > 0) {
center.y += MIN(scrollDelta, scrollDelta * scrollResistance);
}
item.center = center;
[_animator updateItemUsingCurrentState:item];
}
return NO;
}
@end
在這裏引起這種循環運動會發生什麼?我只是改變了我的UIAttachmentAttributes
中心的Y軸屬性。
center.y += MIN(scrollDelta, scrollDelta * scrollResistance);
我在這裏錯過了什麼? (在其他項目中嘗試了這種確切的佈局,似乎工作)。
編輯:
我上傳了一個樣本項目(刪除),自定義集合視圖佈局類叫做VVSpringCollectionViewFlowLayout.m
,沒有太多的時間去考慮這個太多我自己,因爲我有很多最近在做工作。
當示例項目運行(Xcode 7 beta或更高版本)時,系統會提示您使用滑塊,一直拖動到右側以可視化「集合視圖單元」。
嗨,這裏是一個最小項目的鏈接,顯示了類的工作原理,https://www.dropbox.com/s/m6wsfqbaim3xhmq/SpringyCollectionView.zip?dl=0 –
該項目並沒有實際編譯,但無論如何......出於某種原因,我在我的項目中看到了上述行爲。這不回答原來的問題... 我可能會繼續併發佈一個小樣本項目揭露這個問題。 – Goles
嘿,不知道爲什麼不在你的系統上編譯。這是一個從頭開始創建項目的5分鐘視頻。 https://www.dropbox.com/s/2ffptx2wfdbmm5g/OriginalSpringyDemo.mp4?dl=0也許你會發現一些東西。我在我的項目中嘗試了多種變化,例如水平跳動等,但無法再現您的問題。一個示例項目將非常適合親眼看到問題。 –