2015-11-26 4 views
2

Я получил следующее, используя UIScrollView и включенный пейджинг. enter image description hereПейджинг UIScrollView с анимацией

Я хочу, чтобы элемент центра прокрутки отображался немного больше, чем другие элементы. Необходимо увеличить/уменьшить шрифт текстовой метки, поскольку прокрутка просматривается в зависимости от ее местоположения.

Я пробовал использовать трансформацию, но не повезло.

код для добавления лейбла:

array = [[NSMutableArray alloc] init]; 

for(int i=0;i<10;i++){ 
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(x, 0, 150, 50)]; 
    label.text = [NSString stringWithFormat:@"ID - %d",i]; 
    label.textAlignment = UITextAlignmentCenter; 
    x +=150; 
    [self.scrollView addSubview:label]; 
    [array addObject:label]; 
} 

[self.scrollView setContentSize:CGSizeMake(x, 50)]; 

Animation, которые я провел в ScollViewDidScroll

float position = label.center.x - scrollView.contentOffset.x; 
float offset = 2.0 - (fabs(scrollView.center.x - position) * 1.0)/scrollView.center.x; 
label.transform = CGAffineTransformIdentity; 
label.transform = CGAffineTransformScale(label.transform,offset, offset); 

КОД: чего я достиг до сих пор:

https://www.dropbox.com/s/h2q4qvg3n4fi34f/ScrollViewPagingPeeking.zip?dl=0

+0

Выполнение аффинное преобразование является способ сделать это. Примените его к метке на основе позиции ячейки, которую вы обновляете преобразованием в scrollViewDidScroll: в вашем UIScrollViewDelegate. В чем была проблема, с которой вы столкнулись? – TheBasicMind

+0

Используется для анимации от больших до маленьких, а не от маленьких до больших. Он появился как поп-музыка. Я отредактировал ответ. –

ответ

0

Не используйте scrollview, используйте UICollectionView и сделайте ячейку collectionView больше по размеру экрана.

И Включить его свойство подкачки, чем использовать его методы делегирования.

Это более предпочтительный и эффективный способ подкачки.

+0

Я даже пытался использовать UICollectionView, но я до сих пор не могу добиться анимации. –

0

Он будет работать с использованием вида коллекции. Возвращает атрибуты макета, где масштаб преобразования вычисляется в соответствии с положением. Подкласс UICollectionViewLayout, который вы используете (возможно, UICollectionViewFlowLayout). Для того, чтобы получить изменение размера, основываясь на положении, чтобы работать, вы должны переопределить некоторые из его методов Thusly:

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds 
{ 
    return YES; 
} 

- (NSArray*)layoutAttributesForElementsInRect:(CGRect)rect 
{ 
    NSArray *array = [super layoutAttributesForElementsInRect:rect]; 

    for (UICollectionViewLayoutAttributes *attributes in array) 
    { 
     [self updateLayoutAttributesForItemAtIndexPath:layoutAttributes]; 
    } 

    return array; 
} 

- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UICollectionViewLayoutAttributes *layoutAttributes = [super layoutAttributesForItemAtIndexPath:indexPath]; 
    [self updateLayoutAttributesForItemAtIndexPath:layoutAttributes]; 
} 

- (UICollectionViewLayoutAttributes *)updateLayoutAttributesScaleForPosition:(UICollectionViewLayoutAttributes *)layoutAttributes 
{ 
    // NOTE: Your code assigning an updated transform scale based on the cell position here 

    return layoutAttributes; 
} 

Вероятно, главное, что вы пропали без вести было переопределение к shouldInvalidateLayoutForBoundsChange: метод

+0

Я пробовал использовать это, но все еще испортил все. В представлении коллекции, если пейджинг включен, а клип для границ - нет, тогда он показывает предыдущий и следующий элементы только при прокрутке. Анимация Я до сих пор не могу этого добиться. –

Смежные вопросы