简体   繁体   中英

Add UIViewController as subview of UIScrollView

I am building an app with some scrolling inside. In short, this is my configuration:

1) class_1: a view with a set of elements inside (something similar to camera row) listed by using a collection view

2) class_2: a modal view called by class_1 where I show each singular element selected (from class_1). Inside the same class I have also implemented the horizontal scroll of all the elements

3) class_3: a simple viewcontroller with an imageview inside which will contain the element I will show in class_2

Running my app looks like class_3 is not added as subview of class_2 and all the singular content I try to load are not visible.

Below is my class_2 code

Interface:

#import <UIKit/UIKit.h> 
#import "class_3.h"

@interface class_2 : UIViewController 

@property (strong, nonatomic) IBOutlet UIPageControl *pageControl;
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) NSArray *imageList;

@end

Implementation:

@interface class_2 () {
    NSMutableArray *_viewControllers;
}

    - (void)loadScrollViewWithImage:(NSUInteger)indexImage;

@end

@implementation class_2

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];

    // _imageList is passed from class_1 when I call class_2. Contains an array of images
    self.pageControl.numberOfPages = [_imageList count];
    self.pageControl.currentPage = 0;

    // I store inside an array N objects as the number f images I have to show. At the beginning the array has only null objects, then it will contains the views based on the images I have scrolled.
    //I am storying my images inside a view because maybe I will show more controls and not just the image. It will be much easier manage them.
    _viewControllers = [[NSMutableArray alloc] init];
    for (NSUInteger i = 0; i < [_imageList count]; i++) {
        [_viewControllers addObject:[NSNull null]];
    }

    // I set some properties of my scrollview defined as outlet
    self.scrollView.frame = CGRectMake(0, 0, 320, 345);
    self.scrollView.contentSize = CGSizeMake(CGRectGetWidth(self.scrollView.frame) * [_imageList count], CGRectGetHeight(self.scrollView.frame));
    self.scrollView.pagingEnabled = YES;
    // this is set to NO, I switched to YES just now for debug (at least I can see how big the area is since there are no images visible)
    self.scrollView.showsHorizontalScrollIndicator = YES;
    self.scrollView.showsVerticalScrollIndicator = NO;
    self.scrollView.scrollsToTop = NO;
    self.scrollView.delegate = self;

    // for testing now I always take the first and second elements of my array. I load both so when I move from the first image to the second is already there and there is no gap/flashing effect
    [self loadScrollViewWithImage:0];
    [self loadScrollViewWithImage:1];
}

#pragma mark - Private methods

- (void)loadScrollViewWithImage:(NSUInteger)indexImage {
    // I scrolled until the last image, from here I can only go back
    if (indexImage >= [_imageList count])
        return;

    // I replace the placeholder (null) object
    class_3 *controller = [_viewControllers objectAtIndex:indexImage];
    if ((NSNull *)controller == [NSNull null]) {
        controller = [[class_3 alloc] init];
        [_viewControllers replaceObjectAtIndex:indexImage withObject:controller];
    }

    // I add the controller's view to the scroll view - in case this is the first time I'm scrolling this image
    if (controller.view.superview == nil) {
        // I set my controller frame as the scrollview works as container
        CGRect frame = self.scrollView.frame;
        frame.origin.x = CGRectGetWidth(frame) * indexImage;
        frame.origin.y = 0;
        controller.view.frame = frame;

        // I finally add my viewcontroller as child of my superview and subview of the scrollview
        [self addChildViewController:controller];
        [self.scrollView addSubview:controller.view];
        [controller didMoveToParentViewController:self];

        // I set an image corrisponding with the element selected from class_1
        controller.imageView.image = [_imageList objectAtIndex:indexImage]

        // I also tried with a fake image...just in case. No one of them is visible
        //controller.imageView.image = [UIImage imageNamed:@"tempPhoto"];
    }
}

My class_3 is a viewcontroller which hosts only an image view shoulb be populated with the corresponding image selezted before. The pagecontroller is used to show where I scrolling (letf/right) and how many elements there are. The scrolling is phisically managed with the scrollview. Here is my class_3 definition

Interface:

#import <UIKit/UIKit.h>
#import "class_3.h"

@interface class_3 : UIViewController

@property (strong, nonatomic) IBOutlet UIImageView *imageView;

@end

Implementation (nothing really impressive)

#import "class_3.h"

@interface class_3 ()

@end

@implementation class_3

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    self.imageView.image = [UIImage imageNamed:@"tempPhoto"];
}

@end

What am I missing?

Tnx

Your class_3 should be a UIView , instead of a UIViewController , subclass. See here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM