UIScrollview вызывает superviews layoutSubviews при прокрутке? - PullRequest
12 голосов
/ 12 мая 2010

Я добавил UITableView в качестве подпредставления к пользовательскому классу UIView, над которым я работаю. Однако я заметил, что всякий раз, когда я прокручиваю таблицу, она вызывает мои классы layoutSubviews. Я почти уверен, что это UIScrollview, который наследует таблица, от которой он на самом деле делает это, но хотел знать, есть ли способ отключить эту функцию, и если нет, то почему это происходит? Я не понимаю, почему, когда вы прокручиваете вид прокрутки, ему нужно его суперпредставление для размещения его подпредставлений.

Код:

@implementation CustomView
- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        self.clipsToBounds = YES;

        UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0.0, 15.0, 436.0, 132.0) style:UITableViewStylePlain];
        tableView.dataSource = self;
        tableView.delegate = self;
        tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        tableView.backgroundColor = [UIColor clearColor];
        tableView.showsVerticalScrollIndicator = NO;
        tableView.contentInset = UIEdgeInsetsMake(kRowHeight, 0.0, kRowHeight, 0.0);
        tableView.tag = componentIndex;

        [self addSubview:tableView];
        [tableView release];
    }
    return self;
}
- (void)layoutSubviews {
    // This is called everytime I scroll the tableview
}

@end

Ответы [ 3 ]

2 голосов
/ 26 июля 2010

Да, UIScrollView вызывает layoutsubviews всякий раз, когда прокручивается. Я мог бы поклясться, что это было указано где-то в документации, но, наверное, нет.

В любом случае, преобладающей идеей для этого является то, что UIScrollView должен размещать свои элементы так, чтобы представления, которые в настоящее время не могут быть видны, не были размещены. Поскольку пользователи прокручивают в представлении прокрутки, он должен добавлять и удалять подпредставления по мере необходимости. Я предполагаю, что это то, что TableViews использует для постановки в очередь ячеек таблицы, которые скрыты.

Есть ли какая-то причина, по которой вам было бы важно узнать, вызывается ли layoutsubviews или нет?

1 голос
/ 28 сентября 2011

UITableView, по крайней мере, действительно отображает макет своего суперпредставления. Такое поведение может быть проблематичным, если у вас есть метод layoutSubviews, который может быть дорогим (например, если вы вызываете некоторый JavaScript).

Быстрое исправление - добавление промежуточного подпредставления, которое препятствует тому, чтобы представление прокрутки выложило ваше суперпредставление. Вместо этого он создаст промежуточное подпредставление.

Это может быть несколько несовершенным, но в большинстве случаев должно работать:

Предположим, UIView * intermediateView определена как переменная экземпляра:

-(id) initWithFrame:(CGRect)frame
{
    self = [super initWithFrame: frame];
    if (self)
    {
        UIScrollView * theScrollView; // = your scroll view or table view
        intermediateView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease];
        // Ensures your intermediate view will resize its subviews.
        intermediateView.autoresizesSubviews = YES;

        // Ensure when the intermediate view is resized that the scroll view
        // is given identical height and width.
        theScrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth |
                                         UIViewAutoresizingFlexibleHeight;
        [intermediateView addSubview: theScrollView];

        // Ensure the frame of the scroll view is exactly the bounds of your
        // intermediate view.
        theScrollView.frame = bottomContainerView.bounds;
        [self addSubview: intermediateView];
    }
    return self;
}

-(void) layoutSubviews
{
    intermediateView.frame = CGRectMake(0, 50, 42, 42); // replace with your logic
}
0 голосов
/ 07 июля 2010

Не уверен, что я правильно понимаю вашу проблему, но когда вы прокручиваете таблицу, она удаляет ячейки, не показанные в памяти, и загружает их снова, когда они прокручиваются обратно в видимость (ячейки выделяются по запросу, только видимые), в эффект делает то, что вы, кажется, описываете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...