Проблема: отскок UIScrollview делает отскок Родителя UIScrollview - PullRequest
0 голосов
/ 27 октября 2010

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

  • A имеет размер_файла = номер страницы по горизонтали

  • B имеет размер_изображения = номер подстраницы по вертикали

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

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

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

Спасибо

Ответы [ 2 ]

1 голос
/ 28 ноября 2010

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

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

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

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

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

Я бы также выступил за объединение A & B в единый UIScrollView.

0 голосов
/ 06 января 2014

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

Чтобы создать богатый пользовательский интерфейс, вы можете использовать вложенные представления прокрутки в своем приложении. До 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
...