将UIScrollView添加到UIViewController

时间:2012-12-27 14:06:00

标签: ios uiviewcontroller uiscrollview

我有UIViewController,我想为其添加UIScrollView(启用滚动支持),是否可以?

我知道有可能,如果你有一个UIScrollView来添加UIViewController,但我也感兴趣,如果反向是真的,如果我可以加{{1}现有的UIScrollView,以便我获得滚动功能。

修改

我想我找到了答案:Adding a UIViewController to UIScrollView

1 个答案:

答案 0 :(得分:21)

UIViewController具有view属性。因此,您可以向UIScrollView添加view。换句话说,您可以将滚动视图添加到视图层次结构中。

这可以通过代码或通过XIB实现。此外,您可以将视图控制器注册为滚动视图的委托。通过这种方式,您可以实现执行不同功能的方法。请参阅UIScrollViewDelegate协议。

// create the scroll view, for example in viewDidLoad method
// and add it as a subview for the controller view

[self.view addSubview:yourScrollView];

您还可以覆盖loadView类的UIViewController方法,并将滚动视图设置为您正在考虑的控制器的主视图。

修改

我为你创建了一个小样本。在这里,您有一个滚动视图作为UIViewController视图的子视图。滚动视图有两个视图作为子视图:view1(蓝色)和view2(绿色)。

在这里,我想你只能向一个方向滚动:水平或垂直。在下面,如果您水平滚动,您可以看到滚动视图按预期方式工作。

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIScrollView* scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
    scrollView.backgroundColor = [UIColor redColor];
    scrollView.scrollEnabled = YES;
    scrollView.pagingEnabled = YES;
    scrollView.showsVerticalScrollIndicator = YES;
    scrollView.showsHorizontalScrollIndicator = YES;
    scrollView.contentSize = CGSizeMake(self.view.bounds.size.width * 2, self.view.bounds.size.height);    
    [self.view addSubview:scrollView];

    float width = 50;
    float height = 50;
    float xPos = 10;
    float yPos = 10;

    UIView* view1 = [[UIView alloc] initWithFrame:CGRectMake(xPos, yPos, width, height)];
    view1.backgroundColor = [UIColor blueColor];    
    [scrollView addSubview:view1];

    UIView* view2 = [[UIView alloc] initWithFrame:CGRectMake(self.view.bounds.size.width + xPos, yPos, width, height)];
    view2.backgroundColor = [UIColor greenColor];    
    [scrollView addSubview:view2];
}

如果您只需要垂直滚动,可以按如下方式更改:

scrollView.contentSize = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height * 2);

显然,您需要重新排列view1view2的位置。

P.S。我在这里使用ARC。如果不使用ARC,则需要显式release alloc-init对象。