iphone:部分屏幕UIScrollView

时间:2011-02-22 20:07:35

标签: iphone objective-c uiscrollview

我是一个很长时间的网络人,对iphone开发很陌生。我发现很多问题都源于对网页问题的思考,所以我很可能不会在这个问题上提出正确的问题。尽管如此,在谷歌搜索结果和stackoverflow页面上花了几个小时之后,是时候把这个问题抛到虚空中了:

我正在尝试设置一个在顶部有一些静态/不移动内容的视图(例如,下面显示的内容的标题),并允许“页面”的其余部分滚动。

我现在的思维过程是创建一个包含静态部分和空白区域的视图,然后以某种方式将滚动视图添加到该空白区域,但这是我的知识枯竭的地方。

代码方面,它看起来像这样(我添加了评论以显示我使用此代码的思考过程):

DetailsWrapper.m:

-(void)viewDidLoad {

    //initialize details view (custom constructor that populates some stuff)
    //ListingDetails is a subclass of UIViewController whose view is set to be a UIScrollView created in IB
    //the viewDidLoad method of ListingDetails sets the contentSize of the scroll view
    ListingDetails *details = [[ListingDetails alloc] initWithNibName:@"ListingDetails" andListingData:theListing];

    //create an empty view that takes up all but the top 45px of the iphone screen
    CGRect scrollArea = CGRectMake(0.0f, 45.0f, 320.0f, 435.0f); 
    UIView *scrollView = [[UIView alloc] initWithFrame:scrollArea];

    //add the UIScrollView to the space we just made
    [scrollView addSubview:details.view];

    //now show it
    [self.view addSubview:scrollView];

    //cleanup
    [scrollView release];
    [details release];
}

一切正常,花花公子,正确地拉入内容,滚动视图实际上没有滚动的小问题。如果我尝试正常添加ListingDetails视图,而不使用这个包装器,滚动就可以正常工作了,但我正在做的事情(或者不做什么?)正在使滚动功能停止。

我是否认为这一切都错了?最终的目标是获得一个屏幕,其中一部分滚动而另一部分不滚动,所以如果它有助于忽略我上面的所有漫游而只是解决它,那就去吧。

2 个答案:

答案 0 :(得分:2)

首先,每个屏幕只有一个UIViewController。期。从那里你需要将两个子视图添加到UIViewController的主视图(在viewDidLoad中加载的视图)。要将其置于Web术语中,请将视图控制器的视图视为<body></body>

最后你可能想要这样的东西。

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 45.0)];
    // Further configure your scroll view as you presumably already have in ListingDetails
    [self.view addSubview:scrollView];
    [scrollView release];

    UIView *staticView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 45.0, 320.0, 435.0)];
    [self.view addSubview:staticView];
    [staticView release];
}

编辑:在Interface Builder中设置

在视图控制器的.h

@interface SampleViewController : UIViewController
{
    UIScrollView *scrollView;
    UIView *staticView;
}

@property (nonatomic, retain) IBOutlet UIScrollView *scrollView;
@property (nonatomic, retain) IBOutlet UIView *staticView;

@end

并在.m文件中

@implementation SampleViewController

@synthesize scrollView;
@synthesize staticView;

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.scrollView = nil;
    self.staticView = nil;
}

- (void)dealloc
{
    [scrollView release], self.scrollView = nil;
    [staticView release], self.staticView = nil;
    [super dealloc];
}

@end

现在在Interface Builder文件中,您可以右键单击并从File的Owner(即您的UIViewController子类)直接拖动到屏幕上的视图。当您发布弹出窗口时,将出现并在您要将该视图连接到的代码中选择该属性。一旦建立,您就可以在代码中引用这些视图。

- (void)viewDidLoad
{
    [super viewDidLoad];

    // Assume we need to make some tweaks once the view has loaded
    self.staticView.backgroundColor = [UIColor redColor];
    self.scrollView.backgroundColor = [UIColor blackColor];
}

答案 1 :(得分:0)

我个人不会打扰scrollView实例,而是

[self.view addSubview:details.view];
details.view.frame = scrollArea;

但我不认为这是你的问题。您的代码的另一个问题是您的视图控制器ListingDetails在方法结束时被释放,而视图没有控制器。

基本上,你错了。最好在当前视图控制器中包含所有ListingDetails代码,并在Interface Builder中添加UIScrollView。多个视图控制器可以堆叠在UINavigationControllerUITabBarController中,但除此之外,您应该只有一个UIViewController