Как копировать сообщения, отскакивающие пузырьки в iOS 7

Когда вы находитесь в разговоре в приложении "Сообщения" в iOS 7, если вы прокручиваете вверх или вниз, вы заметите, что пузырьки и, более того, текст, говорящий при отправке сообщений, будет отскакивать.

Я пытаюсь реплицировать это в своем собственном представлении таблицы, но не нахожу способ сделать это.

Я предполагаю, что он использует UIDynamics, но я не уверен, как связать это с помощью прокрутки и отскакивания содержимого.

Любая помощь будет оценена

Ответ 1

Если вы хотите воспроизвести этот эффект самостоятельно, вам понадобится UIKit Dynamics. Меня это интересовало, и это объяснялось на WWDC в этом году.

Взгляните на WWDC Session 217: Изучение прокрутки на iOS 7

Также читается использование компонентов в Интернете, таких как THSpringyCollectionView

Ответ 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;
        }
    }
}