IOS: UIScrollView с бесконечным представлением подкачки - PullRequest
2 голосов
/ 01 августа 2011

У меня есть этот код для просмотра скролла 3 изображения:

const CGFloat kScrollObjHeight = 150.0;
const CGFloat kScrollObjWidth = 320.0;
const NSUInteger kNumImages = 3;


- (void)layoutScrollImages
{
UIImageView *view = nil;
NSArray *subviews = [scrollView1 subviews];

// reposition all image subviews in a horizontal serial fashion
CGFloat curXLoc = 0;
for (view in subviews)
{
    if ([view isKindOfClass:[UIImageView class]] && view.tag > 0)
    {
        CGRect frame = view.frame;
        frame.origin = CGPointMake(curXLoc, 0);
        view.frame = frame;

        curXLoc += (kScrollObjWidth);
    }
}


// set the content size so it can be scrollable
[scrollView1 setContentSize:CGSizeMake((kNumImages * kScrollObjWidth), [scrollView1 bounds].size.height)];

}

- (void)viewDidLoad
{
self.view.backgroundColor = [UIColor viewFlipsideBackgroundColor];

// 1. setup the scrollview for multiple images and add it to the view controller
//
// note: the following can be done in Interface Builder, but we show this in code for clarity
[scrollView1 setBackgroundColor:[UIColor blackColor]];
[scrollView1 setCanCancelContentTouches:NO];
scrollView1.indicatorStyle = UIScrollViewIndicatorStyleWhite;
scrollView1.clipsToBounds = YES;        // default is NO, we want to restrict drawing within our scrollview
scrollView1.scrollEnabled = YES;

// pagingEnabled property default is NO, if set the scroller will stop or snap at each photo
// if you want free-flowing scroll, don't set this property.
scrollView1.pagingEnabled = YES;
scrollView2.pagingEnabled = YES;
scrollView3.pagingEnabled = YES;

// load all the images from our bundle and add them to the scroll view
NSUInteger i;
for (i = 1; i <= kNumImages; i++)
{
    NSString *imageName = [NSString stringWithFormat:@"image%d.jpg", i];
    UIImage *image = [UIImage imageNamed:imageName];
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

    // setup each frame to a default height and width, it will be properly placed when we call "updateScrollList"
    CGRect rect = imageView.frame;
    rect.size.height = kScrollObjHeight;
    rect.size.width = kScrollObjWidth;
    imageView.frame = rect;
    imageView.tag = i;  // tag our images for later use when we place them in serial fashion
    [scrollView1 addSubview:imageView];
    //[scrollView2 addSubview:imageView];
    //[scrollView3 addSubview:imageView];
    [imageView release];
}

[self layoutScrollImages];  // now place the photos in serial layout within the scrollview

}

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

1 Ответ

8 голосов
/ 01 августа 2011

Основная идея состоит в том, чтобы установить себя как UIScrollViewDelegate и применить некоторую арифметику по модулю к позиции прокрутки, чтобы обернуть ее вокруг.

Есть два основных варианта этой идеи. Предположим, что ваши изображения A, B, C, поэтому в настоящее время они находятся внутри скролл-вида, упорядоченного как ABC.

В более логически приятном решении - особенно если у вас было много-много изображений - вы наблюдаете положение прокрутки и, как только оно достигает положения, когда представление перемещается вправо и C покидает экран, вы переупорядочиваете изображения в виде CAB и сдвинуть текущую позицию прокрутки на одну точку вправо, чтобы перемещение было невидимым для пользователя. Другими словами, положение прокрутки ограничено областью из двух экранов, центрированных по центру B (таким образом, вы получаете все B и половину экрана с обеих сторон). Всякий раз, когда вы оборачиваете его откуда-то слева, куда-то справа, вы перемещаете все изображения на одно место вправо. И наоборот.

В немного более простом осуществлении варианта вместо создания вида с прокруткой с изображениями, расположенными ABC, расположите их как CABCA. Затем примените ту же логику, но к центральной области из четырех экранов и не выполняйте перестановку изображений.

Убедитесь, что вы используете setContentOffset: (или точечную запись, как в scrollView.contentOffset =) в качестве установщика. setContentOffset:animated: будет отрицать скорость.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...