Objective c 如何在启用分页的scrollview中添加多个用户交互视图

Objective c 如何在启用分页的scrollview中添加多个用户交互视图,objective-c,uiview,uiscrollview,nsarray,uipagecontrol,Objective C,Uiview,Uiscrollview,Nsarray,Uipagecontrol,我正在尝试向现有代码中添加一组用户交互视图。 我有以下代码和一个数组,该数组使用scrollview(带有页面控件)来显示一组图像。我想修改代码以显示在interface builder中创建的用户交互视图数组。通过用户交互,这些视图将具有按钮和可缩放的图像视图 -----现行代码----- 具有scrollview的视图控制器的实现文件(.m) #import "AboutViewController.h" @interface AboutViewController () @end @

我正在尝试向现有代码中添加一组用户交互视图。 我有以下代码和一个数组,该数组使用scrollview(带有页面控件)来显示一组图像。我想修改代码以显示在interface builder中创建的用户交互视图数组。通过用户交互,这些视图将具有按钮和可缩放的图像视图

-----现行代码-----

具有scrollview的视图控制器的实现文件(.m)

#import "AboutViewController.h"

@interface AboutViewController ()

@end

@implementation AboutViewController

@synthesize scrollView;
@synthesize pageControl;
@synthesize imageArray;

int page;

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

- (void)viewDidLoad
{
    [super viewDidLoad];
    //Can we load and display ViewControllers as opposed to images?  
    imageArray = [[NSArray alloc] initWithObjects:@"1.png", @"2.png", @"3.png", nil];

    for (int i = 0; i < [imageArray count]; i++ ) {
       int page = scrollView.contentOffset.x / scrollView.frame.size.width;

       CGRect frame;
       frame.origin.x = self.scrollView.frame.size.width * i;
       frame.origin.y = 0;
       frame.size = self.scrollView.frame.size;

        UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
        imageView.image = [UIImage imageNamed:[imageArray objectAtIndex:i]];
        [self.scrollView addSubview:imageView];

       NSLog (@"page %d",page);

    }

    scrollView.contentSize = CGSizeMake(scrollView.frame.size.
                             width *[imageArray count], 
                          scrollView.frame.size.height);
}

#pragma mark - UIScrollView Delegate
- (void)scrollViewDidScroll:(UIScrollView *)sender
{

    CGFloat pageWidth = self.scrollView.frame.size.width;
    //calculate current page in scrollview 
    int page = floor((self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    self.pageControl.currentPage = page;
    NSLog (@"page %d",page);
}

- (IBAction)done:(id)sender
{
    [self.delegate aboutViewControllerDidFinish:self];

}

@end
#import <UIKit/UIKit.h>

@class AboutViewController;

@protocol AboutViewControllerDelegate

- (void)aboutViewControllerDidFinish:(AboutViewController *)controller;
@end

@interface AboutViewController : UIViewController<UIScrollViewDelegate>


@property (strong, nonatomic,retain) id <AboutViewControllerDelegate> delegate;
@property (nonatomic,strong,) IBOutlet UIScrollView *scrollView;
@property (nonatomic, strong) IBOutlet UIPageControl *pageControl;
@property (nonatomic, strong) NSArray *imageArray;
@property(nonatomic, assign) IBOutlet UILabel *label;

- (IBAction)done:(id)sender; //returns back to main menu after a button is pressed

@end
#导入“AboutViewController.h”
@关于VIEWCONTROLLER()的接口
@结束
@关于VIEWCONTROLLER的实现
@综合滚动视图;
@综合页面控制;
@综合成像阵列;
整版;
-(id)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle*)nibBundleOrNil
{
self=[super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
如果(自我){
//自定义初始化
}
回归自我;
}
-(无效)viewDidLoad
{
[超级视图下载];
//我们可以加载和显示视图控制器而不是图像吗?
imageArray=[[NSArray alloc]initWithObjects:@“1.png”,“2.png”,“3.png”,nil];
对于(int i=0;i<[imageArray计数];i++){
int page=scrollView.contentOffset.x/scrollView.frame.size.width;
CGRect帧;
frame.origin.x=self.scrollView.frame.size.width*i;
frame.origin.y=0;
frame.size=self.scrollView.frame.size;
UIImageView*imageView=[[UIImageView alloc]initWithFrame:frame];
imageView.image=[UIImage ImageName:[imageArray objectAtIndex:i]];
[self.scrollView addSubview:imageView];
NSLog(@“第%d页”,第页);
}
scrollView.contentSize=CGSizeMake(scrollView.frame.size)。
宽度*[imageArray计数],
滚动视图。帧。大小。高度);
}
#pragma标记-UIScrollView委托
-(无效)scrollViewDidScroll:(UIScrollView*)发送方
{
CGFloat pageWidth=self.scrollView.frame.size.width;
//在scrollview中计算当前页面
intpage=floor((self.scrollView.contentOffset.x-pageWidth/2)/pageWidth)+1;
self.pageControl.currentPage=page;
NSLog(@“第%d页”,第页);
}
-(iAction)完成:(id)发送方
{
[self.delegate aboutviewcontrollerdFinish:self];
}
@结束
具有scrollview的视图控制器的头文件(.h)

#import "AboutViewController.h"

@interface AboutViewController ()

@end

@implementation AboutViewController

@synthesize scrollView;
@synthesize pageControl;
@synthesize imageArray;

int page;

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

- (void)viewDidLoad
{
    [super viewDidLoad];
    //Can we load and display ViewControllers as opposed to images?  
    imageArray = [[NSArray alloc] initWithObjects:@"1.png", @"2.png", @"3.png", nil];

    for (int i = 0; i < [imageArray count]; i++ ) {
       int page = scrollView.contentOffset.x / scrollView.frame.size.width;

       CGRect frame;
       frame.origin.x = self.scrollView.frame.size.width * i;
       frame.origin.y = 0;
       frame.size = self.scrollView.frame.size;

        UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame];
        imageView.image = [UIImage imageNamed:[imageArray objectAtIndex:i]];
        [self.scrollView addSubview:imageView];

       NSLog (@"page %d",page);

    }

    scrollView.contentSize = CGSizeMake(scrollView.frame.size.
                             width *[imageArray count], 
                          scrollView.frame.size.height);
}

#pragma mark - UIScrollView Delegate
- (void)scrollViewDidScroll:(UIScrollView *)sender
{

    CGFloat pageWidth = self.scrollView.frame.size.width;
    //calculate current page in scrollview 
    int page = floor((self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
    self.pageControl.currentPage = page;
    NSLog (@"page %d",page);
}

- (IBAction)done:(id)sender
{
    [self.delegate aboutViewControllerDidFinish:self];

}

@end
#import <UIKit/UIKit.h>

@class AboutViewController;

@protocol AboutViewControllerDelegate

- (void)aboutViewControllerDidFinish:(AboutViewController *)controller;
@end

@interface AboutViewController : UIViewController<UIScrollViewDelegate>


@property (strong, nonatomic,retain) id <AboutViewControllerDelegate> delegate;
@property (nonatomic,strong,) IBOutlet UIScrollView *scrollView;
@property (nonatomic, strong) IBOutlet UIPageControl *pageControl;
@property (nonatomic, strong) NSArray *imageArray;
@property(nonatomic, assign) IBOutlet UILabel *label;

- (IBAction)done:(id)sender; //returns back to main menu after a button is pressed

@end
#导入
@关于视频控制器的课程;
@关于IEWControllerDelegate的协议
-(void)aboutviewcontrollerdifinish:(AboutViewController*)控制器;
@结束
@关于ViewController的界面:UIViewController
@属性(强、非原子、保留)id委托;
@属性(非原子,强,)IBMOutlet UIScrollView*scrollView;
@属性(非原子,强)IBUIPageControl*pageControl;
@属性(非原子,强)NSArray*imageArray;
@属性(非原子,赋值)IBUILabel*label;
-(iAction)完成:(id)发送方//按下按钮后返回主菜单
@结束
---------------------------更新----------------------------------

进一步澄清:


对于那些可能会加入这个问题的人,我之前对在scrollview中嵌入视图控制器而不是视图感到困惑。我现在认为在scrollview中嵌入视图控制器是不可能的,但可以在其中嵌入视图

您可能会与
UIView
UIViewController
混淆。只能显示
ui视图
。例如,您的imageView是
UIImageView
(它是
UIView
的子类)的一个实例,因此它可以显示在屏幕上
UIViewController
负责创建和配置
UIView
实例,无法显示

通常,会制作一个
UIViewController
,以控制可在其上添加子视图的全屏视图。如果您想在屏幕上显示多个图像,使用带有
UIPageControl
UIScrollView
就足够了

如果需要构建多个页面,并且每个页面都有其依赖的外观和用户交互,则可以选择
UINavigationController
来管理多个
UIViewController
实例,并在其关联
UIViewController
中创建和配置每个页面

一个
NSArray
(及其子类的任何实例,如
NSMutableArray
)可以容纳任何类型的对象。视图控制器是一个对象,因此
NSArray
实例可以容纳它

请注意,数组包含对其包含的对象的强引用,因此,如果将对象添加到数组中,即使删除了所有其他引用(例如,将它们设置为
nil
),它也将保留在内存中。当然,直到从数组中删除对象


顺便说一句,所有这些注意事项对于集合和字典也是有效的。

你是在问如何创建一个数组并用ViewController填充它吗?是的,John,这基本上就是我想要的。你看,我的目标是创建一个带有ViewController的数组,这样如果用户导航到AboutViewController,他们就可以在嵌入式ViewController的页面之间滚动。我可以建议使用NSCache,如果内存消耗过高,它可以处理逐出对象。您可以检查缓存是否具有所需的视图控制器,如果没有,请创建它并添加到缓存中。现在还不清楚你遇到了什么问题,或者你陷入了什么困境。你能更具体地说明你有什么问题吗?我更新了问题,以澄清我在寻找什么。