我是一个很长时间的网络人,对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视图,而不使用这个包装器,滚动就可以正常工作了,但我正在做的事情(或者不做什么?)正在使滚动功能停止。
我是否认为这一切都错了?最终的目标是获得一个屏幕,其中一部分滚动而另一部分不滚动,所以如果它有助于忽略我上面的所有漫游而只是解决它,那就去吧。
答案 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。多个视图控制器可以堆叠在UINavigationController
或UITabBarController
中,但除此之外,您应该只有一个UIViewController
。