以编程方式实现UIScrollView [英] Implementing UIScrollView programmatically

查看:83
本文介绍了以编程方式实现UIScrollView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

来自苹果的页面控制示例界面构建器中有一个ScrollView。它与相应的IBOutlet相关联。我想更改代码,所以这一切都是以编程方式完成的。我删除了界面构建器对象,删除了IBOutlet关键字。我分配并初始化scrollView,但是当我运行程序时没有出现。

In the page control sample from apple there is a ScrollView in the interface builder. It is linked with the corresponding IBOutlet. I want to change the code so this is all done programatically. I delete the interface builder object, I delete the IBOutlet keyword. I alloc and init the scrollView, but nothing appears when I run the program.

我认为这是因为我需要将它作为子视图分配给主视图。或者我呢?我仍然不太了解所有观点是如何工作和相互作用的。如果我做 [self.view addSubView:ScrollView]; 我得到一个运行时错误(或者某些东西,它通常只是说像BAD ACCESS或SIGABRT)。

I assume this is because I need to assign it as a subView to the main view. Or do I? I still don't really understand how all the views work and interact with each other. If I do [self.view addSubView:ScrollView]; I get a runtime error (or something, it usually just says something like BAD ACCESS or SIGABRT).

我做错了什么?我完全走错了路吗? (只有两天的ios编程,在树林里仍然有点迷失)

What am I doing wrong? Am I on the wrong path completely? (only two days in to ios programming, still a bit lost in the woods)

电话内容控制器中的awakeFromNib:

awakeFromNib in phone content controller:

- (void)awakeFromNib
{
scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

// load our data from a plist file inside our app bundle
NSString *path = [[NSBundle mainBundle] pathForResource:@"content_iPhone" ofType:@"plist"];
self.contentList = [NSArray arrayWithContentsOfFile:path];

// view controllers are created lazily
// in the meantime, load the array with placeholders which will be replaced on demand
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++)
{
    [controllers addObject:[NSNull null]];
}
self.viewControllers = controllers;
[controllers release];

// a page is the width of the scroll view
scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages,  scrollView.frame.size.height);
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.scrollsToTop = NO;
scrollView.delegate = self;

pageControl.numberOfPages = kNumberOfPages;
pageControl.currentPage = 0;

// pages are created on demand
// load the visible page
// load the page on either side to avoid flashes when the user starts scrolling
//
[self loadScrollViewWithPage:0];
[self loadScrollViewWithPage:1];
}

头文件:

#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>

#import "ContentController.h"

@interface PhoneContentController : ContentController <UIScrollViewDelegate>
{   
UIScrollView *scrollView;
UIPageControl *pageControl;
NSMutableArray *viewControllers;

// To be used when scrolls originate from the UIPageControl
BOOL pageControlUsed;
}

@property (nonatomic, retain) UIScrollView *scrollView;
@property (nonatomic, retain) IBOutlet UIPageControl *pageControl;

@property (nonatomic, retain) NSMutableArray *viewControllers;

- (IBAction)changePage:(id)sender;

@end

appDelegate:

appDelegate:

#import "AppDelegate.h"
#import "ContentController.h"

@implementation AppDelegate

@synthesize window, contentController;

- (void)dealloc
{
[window release];
[contentController release];

[super dealloc];
}

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
NSString *nibTitle = @"PadContent";
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
{
    nibTitle = @"PhoneContent";
}
[[NSBundle mainBundle] loadNibNamed:nibTitle owner:self options:nil];

[self.window addSubview:self.contentController.view];
[window makeKeyAndVisible];
}

@end

并且scrollView已被删除来自xib文件。注意:这是下载程序的新版本,我所做的就是删除scrollView的IBOutlet关键字,从xib中删除滚动,并从nib中清醒地添加alloc,init行。

and the scrollView has been deleted from the xib file. Note: this is a new version of the downloaded program where all I have changed is deleting the IBOutlet keyword for the scrollView, deleted the scroll from the xib and added the alloc, init line in awake from nib.

我已经建议更改appDelegate并将awakeFromNib更改为init方法,我已经尝试了所有这些,但它仍然不起作用。

I've had suggestions to change the appDelegate and change the awakeFromNib to an init method, i've tried all this but it still doesn't work.

推荐答案

由于你没有从nib文件加载接口,你应该在你的<设置 UIScrollView code> PhoneContentController 's init 方法:

Since you're not loading the interface from a nib file, you should set up your UIScrollView in your PhoneContentController's init method:

- (id)init
{
    [super init];

    if (self) {
        scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 20, 320, 440)];
        pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>)]; // Place it where you want it.
        viewControllers = [[NSMutableArray alloc] init];

        // load our data from a plist file inside our app bundle
        NSString *path = [[NSBundle mainBundle] pathForResource:@"content_iPhone" ofType:@"plist"];
        self.contentList = [NSArray arrayWithContentsOfFile:path];

        // view controllers are created lazily
        // in the meantime, load the array with placeholders which will be replaced on demand
        NSMutableArray *controllers = [[NSMutableArray alloc] init];
        for (unsigned i = 0; i < kNumberOfPages; i++)
        {
            [controllers addObject:[NSNull null]];
        }
        self.viewControllers = controllers;
        [controllers release];

        // a page is the width of the scroll view
        scrollView.pagingEnabled = YES;
        scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height);
        scrollView.showsHorizontalScrollIndicator = NO;
        scrollView.showsVerticalScrollIndicator = NO;
        scrollView.scrollsToTop = NO;
        scrollView.delegate = self;

        pageControl.numberOfPages = kNumberOfPages;
        pageControl.currentPage = 0;

        // pages are created on demand
        // load the visible page
        // load the page on either side to avoid flashes when the user starts scrolling
        //
        [self loadScrollViewWithPage:0];
        [self loadScrollViewWithPage:1];
    }

    return self;
}

AppDelegate ,进行以下更改:

- (void)applicationDidFinishLaunching:(UIApplication *)application
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
        contentController = [[PhoneContentController alloc] init];
    } else {
        contentController = [[PadContentController alloc] init];
    }

    [self.window addSubview:contentController.view];
    [window makeKeyAndVisible];
}

这篇关于以编程方式实现UIScrollView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆