问题:UIScrollview弹跳使Parent UIScrollview弹跳

时间:2010-10-27 12:58:36

标签: iphone cocoa-touch uiscrollview bounce

我在全屏UIScrollview(A)中有全屏UIScrollview(B)。

  • A的内容大小=水平页面数

  • B的内容大小=垂直子页面数

  • 在B里面,我有一个小的UIscrollview(C),滚动方向与B方向相同......所以也是垂直方向。

当C滚动时,它会在到达contentSize的末尾时创建一个强硬的弹跳效果。

问题:它也会对B产生影响!!!!有没有办法抑制父母与孩子之间反弹效应的污染,而不会抑制两者的弹跳效果。

由于

2 个答案:

答案 0 :(得分:1)

Apple文档警告不要使用类似的设计。来自the docs

  

重要说明:您不应在UIScrollView对象中嵌入UIWebView或UITableView对象。如果这样做,可能会导致意外行为,因为两个对象的触摸事件可能会混淆和错误处理。

由于您发现的原因,我会将此警告扩展到嵌套的UIScrollViews。

您可以通过大致了解移动Safari浏览器的功能,将其从嵌套的A / B / C UIScrollViews模拟中删除。用户处于“网页选择”模式(您的A& B视图)或“查看网页”模式(您的C视图)。 Safari的自定义WebView控制器中的按钮允许用户跳出“查看网页”模式到“网页选择”模式,这是一个UIScrollView,其中包含当前活动的每个页面的缩略图。

因此,在您的情况下,这意味着将C拉出嵌套的UIScrollViews,向C视图控制器添加一个按钮,该按钮呈现A& B视图控制器,并且可能创建另一个控制器类以将它们粘合在一起。 / p>

我还提倡将A& B组合成一个UIScrollView。

答案 1 :(得分:0)

根据Apple iOS Scroll View Programming Guide现在......

  

要创建丰富的用户体验,您可能希望在应用程序中嵌套滚动视图。在iOS 3.0之前,即使不是不可能,也很难实现这一目标。在iOS 3.0中,此功能完全受支持并自动运行。

因此嵌套滚动视图非常精细> iOS 3.为了回答你的问题,我将scrollview C作为子视图添加到“容器”UIView中 - 在将该容器视图添加到scrollview B之前。似乎停止弹跳将父滚动视图向下拉,尽管我确实需要刷相当努力使其在没有容器视图的情况下展示您描述的行为。

@interface TiledScrollView : UIScrollView @end

@implementation TiledScrollView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if(self)
    {
        self.layer.borderColor = [UIColor whiteColor].CGColor;
        self.layer.borderWidth = 10.f;
    }
    return self;
}

- (void)setContentSize:(CGSize)contentSize
{
    [super setContentSize:contentSize];

    BOOL horizontal = contentSize.width > self.frame.size.width;

    if(horizontal)
    {
        CGFloat col = self.contentSize.width / 10.f;
        for (int i = 0; i < 10; i++)
        {
            UIView * view = [[UIView alloc] initWithFrame:CGRectMake(i * col, 0, col, self.contentSize.height)];
            view.backgroundColor = [UIColor colorWithHue:(arc4random() % 100) / 100.f saturation:1.f brightness:1.f alpha:1.f];
            [self addSubview:view];
        }
    }
    else
    {
        CGFloat row = self.contentSize.height / 10.f;
        for (int i = 0; i < 10; i++)
        {
            UIView * view = [[UIView alloc] initWithFrame:CGRectMake(0, i * row, self.contentSize.width, row)];
            view.backgroundColor = [UIColor colorWithHue:(arc4random() % 100) / 100.f saturation:1.f brightness:1.f alpha:1.f];
            [self addSubview:view];
        }
    }
}

@end

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    CGRect bounds = [UIScreen mainScreen].bounds;
    TiledScrollView * A = [[TiledScrollView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height)];
    TiledScrollView * B = [[TiledScrollView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height / 2.f)];
    TiledScrollView * C = [[TiledScrollView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height / 4.f)];

    [A setContentSize:CGSizeMake(bounds.size.width * 4, bounds.size.height)];
    [B setContentSize:CGSizeMake(bounds.size.width, bounds.size.height * 4)];
    [C setContentSize:CGSizeMake(bounds.size.width, bounds.size.height * 4)];

    UIView * container = [[UIView alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, bounds.size.height / 4.f)];

    [container addSubview:C];
    [B addSubview:container];
    [A addSubview:B];
    [self.view addSubview:A];
}

@end