2012-06-06 3 views
1

Я хочу реализовать scrollview с несколькими UIView внутри. Самый левый элемент должен быть больше, чем остальные элементы. Так что моя проблема в этом. Всякий раз, когда элемент покидает экран слева (его origin.x меньше 15), мне нужно масштабировать элемент с 470x440 до 235x220 пикселей. Это довольно просто реализовать. Проблема в том, что элемент, который перемещается влево от пикселя 480, должен быть увеличен с 235x220 пикселей до 470x440 пикселей, и его нужно перемещать влево на 235 пикселей (чтобы он не перекрывал элемент справа от него, но скорее переместитесь в пространство, оставленное уходящим элементом, когда оно «сжалось».UIScrollView с subView Масштабирование

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

Кто-нибудь знает, как я могу реализовать этот тип функций? Заметьте, что я не хочу увеличивать масштаб, но я хочу изменить размеры элементов внутри прокрутки таким образом, большинство элементов (которые видны на экране) в два раза больше других элементов.

+1

Checkout [Расширенный прокруткой Методы - WWDC2011] (https://developer.apple.com/videos/wwdc/2011/?id=104). Вы должны найти свой ответ там - в конце видео, но стоит посмотреть, с самого начала (вам нужно войти в систему с идентификатором разработчика). –

+0

Спасибо за эту ссылку rokjarc! Он говорит о масштабировании, но я не масштабирую весь контент прокрутки, но я изменяю некоторые элементы в прокрутке. Но видео дало мне несколько хороших указателей о том, с чего начать :) –

ответ

3

В случае, если кто-то может быть интересно, я закончил со следующими внутри scrollViewDidScroll:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {   
    float contentOffset = scrollView.contentOffset.x; 
    int leavingElementIndex = [_scrollView indexOfElementLeavingScene:scrollView.contentOffset.x]; 
    int entereingElementIndex = leavingElementIndex + 1; 

    if (leavingElementIndex >= 0 && contentOffset > 0) { 
     CGRect leavingFrame = [[[scrollView subviews] objectAtIndex:leavingElementIndex] frame]; 
     CGRect enteringFrame = [[[scrollView subviews] objectAtIndex:entereingElementIndex] frame]; 

     float scalePerentage = (contentOffset - (_scrollView.smallBoxWidth * leavingElementIndex))/(_scrollView.smallBoxWidth); 
     enteringFrame.size.width = _scrollView.smallBoxWidth + (_scrollView.smallBoxWidth * scalePerentage); 
     enteringFrame.size.height = _scrollView.smallBoxHeight + (_scrollView.smallBoxHeight * scalePerentage); 
     enteringFrame.origin.x = [_scrollView leftMostPointAt:entereingElementIndex] - (_scrollView.smallBoxWidth * scalePerentage); 

     [[[scrollView subviews] objectAtIndex:entereingElementIndex] setFrame:enteringFrame]; 

     leavingFrame.size.width = _scrollView.largeBoxWidth - (_scrollView.smallBoxWidth * scalePerentage); 
     leavingFrame.size.height = _scrollView.largeBoxHeight - (_scrollView.smallBoxHeight * scalePerentage); 

     [[[scrollView subviews] objectAtIndex:leavingElementIndex] setFrame:leavingFrame]; 

     //Reset the other visible frames sizes 
     int index = 0; 
     for (UIView *view in [scrollView subviews]) { 

      if([view isKindOfClass:[SlidingView class]] && index > entereingElementIndex) { 
       CGRect frame = view.frame; 
       frame.size.width = _scrollView.smallBoxWidth; 
       frame.size.height = _scrollView.smallBoxHeight; 
       frame.origin.x = [_scrollView leftMostPointAt:index]; 
       [view setFrame:frame]; 
      } 

      index++; 
     } 

    }  
} 

Это то, что он выглядит в конце:

End Result http://stuff.haagen.name/iOS%20scroll%20resize.gif

+0

Это реализовано более полно в следующем проекте: https://github.com/kantega/meetingrooms –

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