Проблема: подпрыгивание UIScrollview заставляет родительский UIScrollview подпрыгивать

У меня полноэкранный UIScrollview (B) в полноэкранном UIScrollview (A).

  • A имеет размер содержимого = количество страниц по горизонтали

  • B имеет размер содержимого = количество подстраниц по вертикали

  • Внутри B у меня есть небольшой UIscrollview (C), который прокручивается в том же направлении, что и B ... Так же и по вертикали.

Когда C дико прокручивает, он создает эффект жесткого отскока при достижении конца contentSize.

проблема: ЭТО ТАКЖЕ СОЗДАЕТ НАПРЯГАЮЩИЙ ЭФФЕКТ НА B !!!! есть ли способ подавить это загрязнение эффекта отскока между родителями и детьми, не подавляя эффект отскока обоих.

Спасибо


person xeonarno    schedule 27.10.2010    source источник
comment
находится ли ваш палец за пределами C (то есть в B), когда он начинает подпрыгивать?   -  person boreas    schedule 27.10.2010
comment
движение начинается в C, и да, палец находится за пределами C, когда он начинает подпрыгивать. Почему ?   -  person xeonarno    schedule 05.11.2010


Ответы (2)


Документация Apple предостерегает от подобных конструкций. Из документов:

Важно: не следует встраивать объекты UIWebView или UITableView в объекты UIScrollView. Если вы это сделаете, это может привести к неожиданному поведению, потому что события касания для двух объектов могут быть перепутаны и неправильно обработаны.

Я бы распространил это предупреждение на вложенные UIScrollViews по причинам, которые вы обнаружили.

Вы можете сделать это аналогом вложенных A / B / C UIScrollViews, сделав примерно то же, что и мобильный браузер Safari. Пользователь находится либо в режиме «выбора веб-страницы» (ваши просмотры A&B), либо в режиме «просмотра веб-страницы» (ваше представление C). Кнопка в настраиваемом контроллере WebView Safari позволяет пользователю перейти из режима «просмотр веб-страницы» в режим «выбор веб-страницы», который представляет собой UIScrollView с эскизами каждой из страниц, активных в данный момент.

Итак, в вашем случае это означало бы вытащить C из вложенных UIScrollViews, добавить кнопку к контроллеру представления C, который представляет контроллер представления A&B, и, возможно, создать еще один класс контроллера, чтобы склеить все это вместе.

Я также рекомендую объединить A&B в один UIScrollView.

person John Franklin    schedule 28.11.2010

Согласно Руководству по программированию прокрутки Apple iOS сейчас ..

Чтобы создать богатый пользовательский интерфейс, вы можете вложить в свое приложение представления прокрутки. До iOS 3.0 это было сложно, если вообще возможно. В iOS 3.0 эта функция полностью поддерживается и работает автоматически.

Таким образом, вложение scrollviews вполне нормально> 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
person Siôn    schedule 06.01.2014