2012-05-27 2 views
4

У меня есть UIScrollView с пейджингом с несколькими подзонами на странице: UIButton, UIwebview и UIImageView. И веб-просмотр, и изображение меняются на каждой странице. Это прекрасно работает. Я использовал Яблоки scrolling image paging example, чтобы начать.Как добавить несколько UIImageViews для подкачки UIScrollView?

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

Это код внутри viewdidload для первого изображения (работает отлично):

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


    // setup each frame to a default height and width, it will be properly placed when we call "updateScrollList" 
    CGRect rect = imageView2.frame; 
    rect.size.height = imageviewScrollObjHeight; 
    rect.size.width = imageviewScrollObjWidth; 

    // Get the Layer of any view 
    CALayer * imageLayer = [imageView2 layer]; 
    [imageLayer setMasksToBounds:YES]; 
    [imageLayer setCornerRadius:7.0]; 

    // You can even add a border 
    [imageLayer setBorderWidth:1.0]; 
    [imageLayer setBorderColor:[[UIColor lightGrayColor] CGColor]]; 

    imageView2.frame = rect; 
    imageView2.tag = i; // tag our images for later use when we place them in serial fashion 


    [scrollView1 addSubview:imageView2]; 

} 

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

Это код макет первого изображения на каждой странице, различные изображения на странице (за пределами viewdidload) (работает отлично):

// layout images for imageview1 
- (void)layoutScrollImages 
{ 
UIImageView *imageView = nil; 
NSArray *subviews = [scrollView1 subviews]; 

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

     curXLoc += (kScrollObjWidth); 
    } 
} 

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

Это код для второго изображения (внутри viewdidload): (когда я удалить [само layoutNavScrollImages], изображение загружает только на первой странице)

for (i = 1; i <= kNumImages; i++) 
{ 

    UIImage *navBarImage = [UIImage imageNamed:@"navigationbar.png"]; 
    UIImageView *imageViewNavBar = [[UIImageView alloc] initWithImage:navBarImage]; 

    // setup each frame to a default height and width, it will be properly placed when we call "updateScrollList" 
    CGRect navBarRect = imageViewNavBar.frame; 
    navBarRect.size.height = 44; 
    navBarRect.size.width = 320; 
    navBarRect.origin.x = 0; 
    navBarRect.origin.y = 0; 

    /* Get the Layer of any view 
    CALayer * imageLayer = [imageView3 layer]; 
    [imageLayer setMasksToBounds:YES]; 
    [imageLayer setCornerRadius:7.0]; 

    // You can even add a border 
    [imageLayer setBorderWidth:1.0]; 
    [imageLayer setBorderColor:[[UIColor lightGrayColor] CGColor]]; 
    */ 
    imageViewNavBar.frame = navBarRect; 
    imageViewNavBar.tag = i; // tag our images for later use when we place them in serial fashion 

    [scrollView1 addSubview:imageViewNavBar]; 

} 

[self layoutNavScrollImages]; 

И код вне viewdidload: (это переписывает положение первого изображения)

- (void)layoutNavScrollImages 
{ 
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)]; 
} 
+0

Почему вы удаляете [self layoutNavScrollImages] ;? –

+0

Я не удаляю его, просто говоря: когда я его удаляю, изображение правильно загружается на одной странице. Мне нужен способ сделать загрузку изображения на каждой странице и по-прежнему иметь анимацию переключения страниц. – Keaulhaas

+0

Пока не найдено ни одного решения, но обходной путь, который будет работать для этого конкретного проекта, добавив метку вместо изображения с изображением в качестве фона. myLabel.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @ "navigationbar.png"]]; А потом меняется UIImageView к UILabel в layoutNavScrollImages: - (недействительными) layoutNavScrollImages { \t UILabel * вид = ноль; и т.д ... – Keaulhaas

ответ

4

способ сделать это, чтобы сделать один (большой) UIView и добавить все UIImageView как подвид этого UIView , А затем добавьте UIView в качестве подзадачи в UIScrollView.

[totalView addSubview:imageView1]; 
[totalView addSubview:imageView2; 
[totalView addSubview:buttonView1]; 
[totalView addSubview:buttonView2]; 
[totalView addSubview:webView]; 

[scrollView addSubview:totalView]; 

Обязательно установите правильный размер содержимого или Scrollview не будет работать:

[scrollView setContentSize:CGSizeMake((320*kNumImages), 411)]; 

взгляды Настройка и помечать UIView (внутри viewdidload):

NSUInteger i; 
for (i = 1; i <= kNumImages; i++) 
    { 
     //... code to setup views 
     totalView.tag = i; 
    } 
[self layoutViews]; // now place the views in serial layout within the scrollview 

Затем макет вид на каждой странице:

- (void)layoutViews 
{ 
UIView *view = nil; 
NSArray *subviews = [scrollView subviews]; 

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

     curXLoc += (kScrollObjWidth); 
    } 
} 
} 

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

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