我即将在我的iPhone项目中添加UIScrollView
,在实施此功能之前,我想检查一下我的方法是否合适,或者我是否违反了一些我不了解的最佳做法的。
我看到的教程通常涉及向现有UIScrollView
添加UIView
,并且可以从那里开始工作。但是,我想知道我是否可以完全放弃UIView
并将UIScrollView
添加为我的nib文件中唯一的顶级对象。
我的示例项目使用Xcode的基于视图的应用程序模板:
Project navigator http://img542.imageshack.us/img542/5364/projectnavigator.png
我从原始UIView
文件中删除了MySampleViewController.xib
顶级对象,并通过添加UIScrollView
对象将其替换为:
Nib placeholders http://img526.imageshack.us/img526/7709/placeholderobjects.png
现在我的nib文件只在画布中显示这个对象:
Canvas http://img233.imageshack.us/img233/4063/scrollview.png
然后我创建了从UIViewController
的{{1}}出口到view
的链接。
现在,如果我想以编程方式操作UIScrollView的内容,我可以使用以下代码:
UIScrollView
为了实现解决方案A,滚动条插座也必须链接到笔尖的UIScrollView,并且Connections Inspector如下所示:
Connections Inspector http://img228.imageshack.us/img228/8397/connectionsj.png
解决方案A 需要一个插座,这意味着与- (void)viewDidLoad {
[super viewDidLoad];
NSArray *colors = [NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil];
// Solution B: With the following line we avoid creating an extra outlet linking to the UIScrollView top-level object in the nib file
UIScrollView *scrollView = (UIScrollView *)self.view;
for (int i = 0; i < colors.count; i++) {
CGRect frame;
//frame.origin.x = self.scroller.frame.size.width * i; // Solution A: scroller is an IBOutlet UIScrollView *scroller;
frame.origin.x = scrollView.frame.size.width * i; // Solution B
frame.origin.y = 0;
//frame.size = self.scroller.frame.size; // Solution A
frame.size = scrollView.frame.size; // Solution B
UIView *subView = [[UIView alloc] initWithFrame:frame];
subView.backgroundColor = [colors objectAtIndex:i];
//[self.scroller addSubview:subView]; // Solution A
[self.view addSubview:subView]; // Solution B
[subView release];
}
//self.scroller.contentSize = CGSizeMake(self.scroller.frame.size.width * colors.count, self.scroller.frame.size.height); // Solution A
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * colors.count, scrollView.frame.size.height); // Solution B
}
有两个连接:UIScrollView
自己的UIViewController
插座和view
是MySampleViewController
出口。是否合法和/或建议有两个出口指向同一视图?
解决方案B 只涉及链接到该视图的scroller
个UIViewController
个点,并使用以下行:
view
我的问题:
谢谢!
P.S。很抱歉语法高亮,SO无法识别'objective-c'标签的使用
答案 0 :(得分:4)
不,我认为你没办法。
我愿意,我认为UIView没有任何重大成本,加上你想要添加页面控件的内容是什么?并且您不必在每次需要时将控制器的视图转换为UIScrollView。
看起来你已经控制了我。
解决方案A需要一个插座,这意味着有两个连接到UIScrollView:UIViewController自己的视图插座和MySampleViewController的滚动插座。是否合法和/或建议有两个出口指向同一视图?
将IBOutlet设置为您想要直接从视图控制器访问的.nib中定义的任何视图。
如果你不想要两个出口,你可以给滚动视图一个标签然后找到它:
UIScrollView *myScrollView = (UIScrollView *)[self.view viewWithTag:1]
然后你只将视图作为插座,但我只想添加额外的插座。只需确保在viewDidUnload中将它们设置为nil。
此外,您不必保留滚动视图(如果您仍然使用保留/释放)。由于滚动视图位于视图控制器的视图中,因此它保留了一个引用,因此如果使用ARC,则可以通过assign或week来获取scrollview的属性。
希望有所帮助。