Я тиражировал сессию 217 WWDC 2013 года "Изучение прокрутки на iOS 7". Я использую Xcode 7 beta 2, а мой проект - только для iOS 9.
Я пытаюсь использовать UIDynamicAnimator
с моим UICollectionViewLayout
способом, аналогичным тому, который представлен в сеансе 217, чтобы имитировать Message.app. Мой UICollectionViewLayout
является обычным, и по какой-то причине мои ячейки, похоже, крутятся круговыми движениями в моем проекте.
Здесь видео для большей ясности.
Это мой собственный код макета.
// 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
Что может быть здесь, что вызывает это круговое движение? Я только изменяю свойство оси Y моего центра UIAttachmentAttributes
.
center.y += MIN(scrollDelta, scrollDelta * scrollResistance);
Что мне здесь не хватает? (пробовал эту точную компоновку в другом проекте и, похоже, работал).
ИЗМЕНИТЬ:
Я загрузил образец проекта (удаленный), класс макета Custom Collection View называется VVSpringCollectionViewFlowLayout.m
, у меня не было много времени, чтобы изучить это слишком много, так как мне пришлось много работать на работе в последнее время.
Когда проект образца запускается (Xcode 7 beta или вверх), вам будет предложено использовать слайдер, полностью перетащите его вправо, чтобы визуализировать ячейки коллекции.