Как копировать сообщения, отскакивающие пузырьки в iOS 7
Когда вы находитесь в разговоре в приложении "Сообщения" в iOS 7, если вы прокручиваете вверх или вниз, вы заметите, что пузырьки и, более того, текст, говорящий при отправке сообщений, будет отскакивать.
Я пытаюсь реплицировать это в своем собственном представлении таблицы, но не нахожу способ сделать это.
Я предполагаю, что он использует UIDynamics, но я не уверен, как связать это с помощью прокрутки и отскакивания содержимого.
Любая помощь будет оценена
Ответы
Ответ 1
Если вы хотите воспроизвести этот эффект самостоятельно, вам понадобится UIKit Dynamics.
Меня это интересовало, и это объяснялось на WWDC в этом году.
Взгляните на WWDC Session 217: Изучение прокрутки на iOS 7
Также читается использование компонентов в Интернете, таких как THSpringyCollectionView
Ответ 2
Мне также был интересен этот эффект, и во время моих исследований в Интернете я нашел этот учебник - http://www.objc.io/issue-5/collection-views-and-uidynamics.html
Он реализует ту же идею.
Ответ 3
![введите описание изображения здесь]()
Вы можете добавить пружинный отскок к содержимому в вашем прокрутке, например:
-
Настройте представление UIScrollview и добавьте его в представление.
mainScroller = [UIScrollView new];
mainScroller.frame = CGRectMake(0, 0, w, h);
mainScroller.bounces = true;
mainScroller.pagingEnabled = false;
mainScroller.delegate = self;
[self.view addSubview:mainScroller];
-
Разместите UIView и добавьте его в свой scrollview.
contentView = [UIView new];
contentView.frame = CGRectZero;
[mainScroller addSubview:contentView];
-
Добавить subviews вашего "contentView".
UIView * unitView = [UIView new];
unitView.frame = CGRectMake(0, yOff, w, 280);
[contentView addSubview:unitView];
-
Измените размер как contentView, так и scrollview для соответствия содержимому. Ниже w - ширина представления, а yOff - общая кумулятивная высота содержимого.
contentView.frame = CGRectMake(0, 0, w, yOff);
mainScroller.contentSize = CGSizeMake(w, yOff);
-
В вашем методе scrollViewDidScroll добавьте следующий код:
float y = mainScroller.contentOffset.y;
contentView.transform = CGAffineTransformMakeTranslation(0, y);
for (UIView * sub in contentView.subviews){
int index = (int)[contentView.subviews indexOfObject:sub];
float delay = index * 0.03;
float duration = 1.0f - delay;
[UIView animateWithDuration:duration
delay:delay
usingSpringWithDamping:0.8
initialSpringVelocity:0.7
options:UIViewAnimationOptionCurveEaseInOut| UIViewAnimationOptionAllowUserInteraction
animations:^{
sub.transform = CGAffineTransformMakeTranslation(0, -y);
}
completion:^(BOOL finished){
}];
}
Параметр UIViewAnimationOptionAllowUserInteraction позволяет вам немедленно взаимодействовать с контентом. Измените задержку, продолжительность, spring увлажнение и переменные скорости spring в соответствии с вашими потребностями.
Код может быть дополнительно адаптирован для обеспечения сенсорного обнаружения; поскольку он стоит, пружинный отскок возникает в верхней части scrollView и спускается вниз через виды, которые для более коротких scrollViews едва заметны.
EDIT: обнаружение касания
Если вы хотите разрешить обнаружение касания, замените эти строки на свой метод scrollViewDidScroll:
int index = (int)[contentView.subviews indexOfObject:sub];
int deviation = abs(touchIndex - index);
float delay = deviation * 0.03;
float duration = 1.0f - delay;
Где новая переменная touchIndex определяется следующим образом:
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
//grab the location of the touch event
CGPoint location = [scrollView.panGestureRecognizer locationInView:scrollView];
int yTouch = location.y; //grab y coordinate
touchIndex = (yTouch - 100) / 100; //calculate the index of the cell, where 100 is the height of the cell
}
Если у вас есть динамические высоты ячеек, сохраните их в массиве, например. 'selectedHeights'. Затем обновите свой метод scrollViewWillBeginDragging для ниже, где для параметра 'tally' float установлено значение 70, чтобы разрешить заголовок.
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
//grab the location of the touch event
CGPoint location = [scrollView.panGestureRecognizer locationInView:scrollView];
int yTouch = location.y; //grab y coordinate
float tally = 70.0f;
for (int n = 0; n < selectedHeights.count; n++){
float cellHeight = [selectedHeights[n] floatValue];
tally += cellHeight;
if (tally > yTouch){
touchIndex = n;
break;
}
}
}