2010-02-13 5 views
29

Самый простой способ иметь вид прокрутки (с настройкой pagingEnabled для YES) имеет ширину страницы, заданную для чего-то другого, кроме границ прокрутки?UIScrollView - с пейджингом включен, могу ли я «изменить» ширину страницы?

Позвольте привести пример. Предположим, у меня есть вид прокрутки с 10 элементами, каждый размером 150 пикселей, а мой вид прокрутки - 300 пикселей в ширину. Если я начну с отображений 1 и 2, видимых и прокрутив по горизонтали вправо, я хочу, чтобы следующая «страница» показывала пункты 2 и 3. Если я прокручу еще одну страницу вправо, я увижу пункты 3 и 4.

Кто-нибудь это сделал? Если нет, какую стратегию вы бы использовали?

ответ

42

Alexander Repty только что написал блог по этой теме: http://blog.proculo.de/archives/180-Paging-enabled-UIScrollView-With-Previews.html. Короткий ответ: это не так просто, как просто изменить ширину «страницы», но это не слишком сложно.

+0

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

+7

Просто сделайте свой scrollview шириной 150 пикселей, но отключите отсечение. Поместите все это в вид шириной 300 пикселей и включите его для обрезки. –

+0

Спасибо, Бен. Как я упоминал в своем комментарии к ответу Александра, это определенно поставило меня на правильный путь. –

5

Майк,

использовать подход из моего блога, что Бен связанного вас. Сделайте UIScrollView на половину размера окружающего изображения (т. Е. 150 пикселей) и переместите его влево, а не центрируйте.

Это должно дать вам именно то поведение, которое вы хотели.

Приветствия, Alex

+0

Это было не так просто, но я считаю, что я понял это. Ваш пост, безусловно, помог - спасибо! –

4

Это, безусловно, может быть сделано с помощью Scrollview методов делегата & содержание смещения.

Ниже приводится подробный код для того же.

int start; 

int end; 

int k=0; 

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView1 
{ 

    pageControlUsed = NO; 

    start = scrollView.contentOffset.x; 

} 

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView1 willDecelerate:(BOOL)decelerate 
{ 

    end = scrollView.contentOffset.x; 

} 


- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView1{ 

    int diff = end-start; 

     if (diff>0) 
     { 

     k=k+150; 
     [scrollView setContentOffset:CGPointMake(k, 0) animated:YES]; 

     } 
     else { 

     k=k-150; 
     [scrollView setContentOffset:CGPointMake(k, 0) animated:YES]; 

      } 
} 
2

Просто переопределения scrollViewWillEndDragging

- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { 
    CGFloat pageWidth = 160; 
    targetContentOffset->x = pageWidth * (int)(targetContentOffset->x/pageWidth); 
} 
+1

не работает в ios7. – kritzikratzi

1
UIScrollView *album = [[UIScrollView alloc] init]; 
album.translatesAutoresizingMaskIntoConstraints = NO; 
album.pagingEnabled = YES; 
album.clipsToBounds = NO; 
album.showsHorizontalScrollIndicator = NO; 
album.contentInset = UIEdgeInsetsMake(0, -50, 0, -50); 
[view addSubview:album]; 


[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-50-[_album(220)]" options:0 metrics:metrics views:views]]; 

[view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_album(300)]" options:0 metrics:metrics views:views]]; 

это прекрасно работает на прошивке 7.1 ~ 8,2

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