2009-09-18 1 views
8

У меня есть UIScrollView с подкачкой в ​​нем (так что типичная модель с UIPageControl и перетаскивание/щелчок влево и вправо между страницами), и у меня есть это нормально работает. Странно то, что когда я хотел избавиться от подпрыгивания (чтобы вы не могли видеть черный за интерфейсом пользователя с левой и правой сторон), внезапный пейджинг больше не работает.UIScrollView - (bounces = NO), кажется, переопределяет (pagingEnabled = YES)

Другими словами, когда:

scrollView.pagingEnabled = YES; 
scrollView.bounces = YES; 

Все работает отлично, за исключением того, я не люблю подпрыгивая на странице (0) и страницы (длина-1). Но когда я делаю это:

scrollView.pagingEnabled = YES; 
scrollView.bounces = NO; 

Он останавливается щелкать на место на каждой странице, вместо того, чтобы обрабатывать все страницы вместе, как одну длинную страницу. Похоже, что по какой-то причине пейджинг зависит от подпрыгивания, что прекрасно, если я могу как-то остановить прыжок. Итак, есть ли другой способ избавиться от него? Или есть что-то, что я делаю неправильно?

EDIT: Решение:

@interface PagingScrollView : UIScrollView 
@end 

@implementation PagingScrollView 

- (id)initWithFrame:(CGRect)frame 
{ 
    if (self = [super initWithFrame:frame]) 
    { 
     self.pagingEnabled = YES; 
     self.bounces = YES; 
    } 
    return self; 
} 

- (void)setContentOffset:(CGPoint)offset 
{ 
    CGRect frame = [self frame]; 
    CGSize contentSize = [self contentSize]; 
    CGPoint contentOffset = [self contentOffset]; 

    // Clamp the offset. 
    if (offset.x <= 0) 
     offset.x = 0; 
    else if (offset.x > contentSize.width - frame.size.width) 
     offset.x = contentSize.width - frame.size.width; 

    if (offset.y <= 0) 
     offset.y = 0; 
    else if (offset.y > contentSize.height - frame.size.height) 
     offset.y = contentSize.height - frame.size.height; 

    // Update only if necessary 
    if (offset.x != contentOffset.x || offset.y != contentOffset.y) 
    { 
     [super setContentOffset:offset]; 
    } 
} 

@end 

ответ

9

Лучше бы написать UIScrollView подкласс и реализовать желаемое поведение вручную. Вы должны быть в состоянии начать с pagingEnabled и bounces оба установлены в YES, а затем перезапишите -setContentOffset: своим методом, который закрепил края.

+0

Вау, это глупо. Хорошо, я попробую это, вы можете просто стать «большим победителем» в этой теме. – Eli

+0

Он работает, но вам нужно переопределить -setContentOffset, not -setContentOffset: анимированный, поскольку последний вызовет функцию, которая не всегда вызывается, тогда как первая переопределяет функцию-мутатор для contentOffset, поэтому вы поймаете все случаи. – Eli

+0

Это странно. Я делаю много такого, и обычно метод одиночных параметров вызывает анимированный вариант с анимированным: ДА – rpetrich