Как создать пейджинговый UIScrollView с "негабаритными" страницами - PullRequest
6 голосов
/ 18 апреля 2011

Есть ли предлагаемый способ создания подкачки UIScrollView, страницы которой шире, чем границы UISrollView?

Мне нужно что-то подобное.

enter image description here

обычная прокрутка на странице 2 и режим подкачки с эффектом «резиновой ленты» по краям страниц.

Эффект пейджинга выглядит немного сложным для меня, если вы быстро щелкаете мышкой, вы переходите на следующую страницу, если вы медленно двигаетесь, вы видите новую страницу по краю и только после определенного момента страница меняется.

Может быть, кто-то может пролить некоторый свет на способ справиться с этим, это возможно даже при единственном использовании методов UIScrollViewDelegate, или мне нужно создать подкласс?

Ответы [ 3 ]

2 голосов
/ 19 апреля 2011

Я впечатлен. На самом деле это было намного проще, чем я думал в начале.

Простым решением было инкапсулировать каждую страницу в виде прокрутки без пейджинга. И сделано. Нет необходимости реализовывать UIScrollViewDelegate, нет необходимости создавать подклассы. Три дополнительные строки кода

Для страниц обычного размера у меня было что-то вроде этого:

UIView *myCustomView = [[[UIView alloc] initWithFrame:CGRectMake(totalWidth, 0, width, height)] autorelease];
[mainScroller addSubview:myCustomView];
totalWidth += width;

и теперь у меня есть это:

UIView *myCustomView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, bigWidth, height)] autorelease];
UIScrollView *secondaryScroller = [[[UIScrollView alloc] initWithFrame:CGRectMake(totalWidth, 0, width, height)] autorelease];
[secondaryScroller setContentSize:myCustomView.frame.size];
[secondaryScroller addSubview:myCustomView];
[mainScroller addSubview:secondaryScroller];
totalWidth += width;

Три строки. Удивительно.


Иерархия представлений:

<UIScrollView: 0x4b32eb0; frame = (0 0; 768 1004); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x4b32d00>; contentOffset: {0, 0}>
   | <UIScrollView: 0x4b32710; frame = (0 0; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x4b35580>; contentOffset: {0, 0}>
   |    | <UIView: 0x4b33f70; frame = (0 0; 1352 1004); layer = <CALayer: 0x4b16c20>>
   | <UIScrollView: 0x4b34790; frame = (768 0; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x4b33e10>; contentOffset: {0, 0}>
   |    | <UIView: 0x4b30fa0; frame = (0 0; 789 1004); layer = <CALayer: 0x4b329f0>>
   | <UIScrollView: 0x4b34920; frame = (1536 0; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x4b33180>; contentOffset: {0, 0}>
   |    | <UIView: 0x4b30d00; frame = (0 0; 1398 1004); layer = <CALayer: 0x4b33120>>
   | <UIScrollView: 0x4b31fe0; frame = (2304 0; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x4b32170>; contentOffset: {0, 0}>
   |    | <UIView: 0x4b34c50; frame = (0 0; 863 1004); layer = <CALayer: 0x4b31f80>>
   | <UIScrollView: 0x4b32460; frame = (3072 0; 768 1004); clipsToBounds = YES; layer = <CALayer: 0x4b325f0>; contentOffset: {0, 0}>
   |    | <UIView: 0x4b323d0; frame = (0 0; 1064 1004); layer = <CALayer: 0x4b32400>>
0 голосов
/ 18 апреля 2011

Я использовал этот учебник -

http://www.edumobile.org/iphone/iphone-programming-tutorials/pagecontrol-example-in-iphone/

Если вы хотите увеличить страницу, вы можете увеличить размер представления PageControlExampleViewControl в этом учебнике.Допустим, сделать его шириной 360 вместо значения по умолчанию 320.

0 голосов
/ 18 апреля 2011

Насколько я знаю, нет способа достичь этого напрямую, используя свойство подкачки scrollviews.

Вы должны будете реализовать свой собственный подкласс UIScrollView, и в вашем файле реализации вам нужно будет реализовать:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event; 

Определите, сколько прокручивается представление прокрутки, используя contentOffset имущество.

И используйте UIScrollViews scrollRectToVisible: для реализации собственных функций прокрутки.

[self scrollRectToVisible:CGRectMake(horizontalScrollAmount,virticalScrollAmount,rectWidth,rectHeight) animated:NO];

Цепочка событий будет выглядеть примерно так: запишите местоположение начала касания, если касание движется, выясните, в каком направлении оно двигалось, проверив, не превышает ли его координата x / y значениеили меньше, чем его начальная позиция, если касание переместило достаточное количество по экрану, затем прокрутите представление по указанному вами размеру подкачки, используя scrollRectToVisible:.

...