我可以在另一个UIScrollView中放置一个UIScrollView吗?

5

我有一个UIScrollView,它只能在垂直方向上滚动,我需要放置一个可以水平移动的UIScrollView,就像苹果设备中的AppStore应用程序一样。我不想使用UICollectionView,因为我有静态数据,并且我只有3个水平的UIScrollView


您可以通过子类化UIScrollView来赋予它像父子一样的属性,或者只需给它们分配标签以区分不同的滚动视图。 - Syed Ali Salman
是的,这是可能的。 - Dharmesh Dhorajiya
4个回答

5

可以。由于UIScrollViewUIView的子类,因此在添加子视图时会按预期行为工作。每个滚动视图将根据其contentSize属性启用滚动。

Objective-C:

UIScrollView *horizontalScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(40.0, 40.0, 300.0, 300.0)];
horizontalScrollView.backgroundColor = [UIColor lightGrayColor];
horizontalScrollView.contentSize = CGSizeMake(2000.0, 300.0);
[self.view addSubview:horizontalScrollView];

UIScrollView *verticalScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(40.0, 40.0, 220.0, 220.0)];
verticalScrollView.backgroundColor = [UIColor greenColor];
verticalScrollView.contentSize = CGSizeMake(220.0, 2000.0);
[horizontalScrollView addSubview:verticalScrollView];

Swift:

let horizontalScrollView = UIScrollView(frame: CGRectMake(40.0, 40.0, 300.0, 300.0))
horizontalScrollView.backgroundColor = UIColor.lightGrayColor()
horizontalScrollView.contentSize = CGSizeMake(2000.0, 300.0)
self.view.addSubview(horizontalScrollView)

let verticalScrollView = UIScrollView(frame: CGRectMake(40.0, 40.0, 220.0, 220.0))
verticalScrollView.backgroundColor = UIColor.greenColor()
verticalScrollView.contentSize = CGSizeMake(220.0, 2000.0)
horizontalScrollView.addSubview(verticalScrollView)

Nested scroll views in action


如果我有两个相同方向的滚动视图,我该怎么办? - Kaaaaai

3

是的,你可以。但是你需要在滚动视图委托方法中区分滚动视图。你可以使用标签或者如果你在整个类中声明它们为全局变量,你可以直接用它们的名称访问它们。例如:

UIScrollView *parentScrollView = [[UIScrollView alloc] init];
parentScrollView.delegate = self;
[self.view addSubview:parentScrollView];

UIScrollView *childScrollView = [[UIScrollView alloc] init];
childScrollView.delegate = self;
[parentScrollView addSubview:childScrollView];

现在,在委托方法中,您可以检查滚动视图,如下所示:
if(scrollview == parentScrollview)
{
// do your actions
}

这仅在您的滚动视图对象是类全局时才可能。您还可以赋予标签,并在滚动视图委托方法中检查该标签,例如:
parentScrollView. tag = 101;

在滚动视图委托方法中

if(scrollview.tag = 101)
    {
    // do your actions
    }

2

UIScrollView有一个叫做scrollEnabled的属性,你可以将其设置为NO来禁用父滚动视图中的滚动。

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    if(scrollView == innerView)
        outerView.scrollEnabled = NO;
    else
        outerView.scrollEnabled = YES;
}

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    if(scrollView == innerView)
    {
         if(innerView.contentOffset.x + innerView.frame.size.width == innerView.contentSize.width)
         {
              outerView.scrollEnabled = NO;
         }
         else
         {
              outerView.scrollEnabled = YES;
         }
    }
}

或者您可以通过下面的链接了解更多信息。


2
是的,这是可能的,但您需要维护 scrollview 的标签来处理滚动视图的代理方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接