UITableView в UIStackView — плавная анимация развертывания и свертывания

Я пытаюсь реализовать представление таблицы, которое позволяет пользователю отображать больше строк, чтобы переключать полное количество строк или меньшее количество строк. У меня есть все данные заранее, когда представление загружено, поэтому мне не нужно извлекать какие-либо дополнительные данные.

Я могу заставить его работать, но проблема, с которой я сталкиваюсь, заключается в том, что мое табличное представление не плавно анимируется при расширении или сворачивании. Что происходит, так это то, что если активируется действие «Показать больше», размер таблицы сразу обновляется до полной высоты таблицы со всеми данными в ней. Тогда строки будут анимированы.

Аналогичным образом при скрытии строк высота таблицы сразу уменьшится до конечной высоты, а затем строки будут анимированы.

Вот картина того, что происходит. Он просто прыгает на полную высоту, а затем анимирует ряды. Но я хотел бы, чтобы он плавно увеличивал высоту таблицы, раскрывая данные по мере того, как она плавно расширялась вниз. Хотелось бы наоборот, где плавно скользит вверх при нажатии показать меньше.

введите здесь описание изображения

Мое приложение выглядит следующим образом:

  • UIScrollView
    • UIStackView
      • UIViewController
      • UIViewController
      • UITableView ‹-- раздел, над которым я работаю здесь
      • UIView
      • ...

По сути, у меня есть прокручиваемый список разделов разных данных. Некоторые разделы представляют собой таблицы, некоторые представляют собой просто специальные представления, организованные с помощью AutoLayout, другие имеют представления коллекции или контроллеры представления страницы или другие типы представлений.

Но этот раздел представлен UITableView в предыдущем списке.

#import "MyTableView.h"
#import "MyAutosizingTableView.h"

@interface MyTableView ()

@property (strong, nonatomic) UILabel *titleLabel;
@property (strong, nonatomic) MyAutosizingTableView *tableView;

@end

@implementation MyTableView

- (instancetype)init {
    return [self initWithFrame:CGRectZero];
}

- (instancetype)initWithCoder:(NSCoder *)coder {
    if (self = [super initWithCoder:coder]) {
        [self initialize];
    }
    return self;
}

- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self initialize];
    }
    return self;
}

- (void)initialize {
    [self.titleLabel setText:@"Details"];
    self.numberOfRows = 3;
    [self addSubview:self.titleLabel];
    [self addSubview:self.tableView];
    
    [NSLayoutConstraint activateConstraints:@[
        [self.titleLabel.leadingAnchor constraintEqualToAnchor:self.layoutMarginsGuide.leadingAnchor],
        [self.titleLabel.topAnchor constraintEqualToAnchor:self.layoutMarginsGuide.topAnchor],
        [self.titleLabel.trailingAnchor constraintEqualToAnchor:self.layoutMarginsGuide.trailingAnchor],
        
        [self.tableView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor],
        [self.tableView.topAnchor constraintEqualToSystemSpacingBelowAnchor:self.titleLabel.bottomAnchor multiplier:1.0f],
        [self.tableView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor],
        [self.tableView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor],
        [self.tableView.widthAnchor constraintEqualToAnchor:self.widthAnchor]
    ]];
}

- (UITableView *)tableView {
    if (!self->_tableView) {
        self->_tableView = [[MyAutosizingTableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
        self->_tableView.translatesAutoresizingMaskIntoConstraints = NO;
        self->_tableView.rowHeight = UITableViewAutomaticDimension;
        self->_tableView.estimatedRowHeight = UITableViewAutomaticDimension;
        self->_tableView.allowsSelection = NO;
        self->_tableView.scrollEnabled = NO;
        self->_tableView.delegate = self;
        self->_tableView.dataSource = self;
        [self->_tableView registerClass:[MyTableViewCell class] forCellReuseIdentifier:@"dataCell"];
    }
    return self->_tableView;
}

- (UILabel *)titleLabel {
    if (!self->_titleLabel) {
        self->_titleLabel = [[UILabel alloc] init];
        self->_titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
        self->_titleLabel.numberOfLines = 0;
        self->_titleLabel.userInteractionEnabled = YES;
        self->_titleLabel.textAlignment = NSTextAlignmentNatural;
        self->_titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
        self->_titleLabel.baselineAdjustment = UIBaselineAdjustmentAlignBaselines;
        self->_titleLabel.adjustsFontSizeToFitWidth = NO;
        
        UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(showMore)];
        [self->_titleLabel addGestureRecognizer:tapGesture];
    }
    return self->_titleLabel;
}

- (void)showMore {
    if (self.numberOfRows == 0) {
        self.numberOfRows = 3;
    } else {
        self.numberOfRows = 0;
    }
    
    NSIndexSet *indexes = [NSIndexSet indexSetWithIndex:0];
    [self.tableView reloadSections:indexes withRowAnimation:UITableViewRowAnimationFade];
}

- (void)setData:(NSArray<NSString *> *)data {
    self->_data = data;
    [self.tableView reloadData];
}


- (void)didMoveToSuperview {
    //this has no effect unless the view is already in the view hierarchy
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
}

#pragma mark - UITableViewDataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (self.numberOfRows <= 0) {
        return self.data.count;
    }
    return MIN(self.data.count, self.numberOfRows);
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *data = self.data[indexPath.row];
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"dataCell" forIndexPath:indexPath];
    cell.data = data;
    return cell;
}

@end

У меня есть подкласс UITableView, который я использовал в предыдущем коде. Причина, по которой у меня есть подкласс табличного представления, заключается в том, чтобы изменить размер таблицы при изменении содержимого. Если кто-нибудь знает лучший способ сделать это без подкласса, мне было бы очень интересно это узнать.

#import "MyAutosizingTableView.h"

@implementation MyAutosizingTableView

- (CGSize)intrinsicContentSize {
    return self.contentSize;
}

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

@end

Кто-нибудь знает, что я могу сделать, чтобы получить плавную анимацию расширения? Мне бы очень хотелось, чтобы таблица плавно расширялась и показывала данные, находящиеся в новых строках.


Обновление - общий обзор того, что я пытаюсь сделать

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

Итак, я работаю над контроллером представления, который отображает данные о продукте, например, представьте себе автомобиль. Контроллер представления имеет разные секции, отвечающие за отображение разных данных. Например, в первом разделе отображаются изображения товара, а для этого раздела я использую UIPageView, который отображает карусель изображений товаров.

В другом разделе отображаются параметры текущего продукта. Например, кто-то может выбрать другой цвет для машины или другие колеса. Для этого раздела я использую табличное представление для отображения списка доступных атрибутов, где каждый атрибут находится в другом разделе таблицы. При нажатии на заголовок раздела в виде таблицы добавляется строка, в которой отображаются доступные параметры для этого атрибута. Например, предположим, что у автомобиля есть разные цвета (красный, зеленый, синий и желтый). При нажатии на заголовок раздела табличное представление добавляет строку и анимирует ее (используя метод, описанный в главе 8 «Программирование iOS 12»). Затем показанная строка содержит UICollectionView, который прокручивается горизонтально, позволяя пользователю выбирать между цветами (или параметрами колеса или любым другим изменяемым атрибутом).

В другом разделе показано, что другие покупатели говорят об этом продукте. Например, если кто-то оставит отзыв об автомобиле, он будет размещен в этом разделе. В этом разделе есть таблица, показывающая, как продукт оценивается по разным критериям. Используя пример с автомобилем, у него может быть ряд по комфорту, другой по расходу топлива, третий по производительности и так далее. Также есть горизонтальный UICollectionView, отображающий отзывы о продукте.

Еще один раздел представляет собой список атрибутов продукта. Например, для автомобиля слева может быть указан объем двигателя, а справа — V12.

И есть и другие разделы, но затем, чтобы связать их все вместе, у меня есть представление прокрутки с вертикальным UIStackView внутри него. И вот что мне действительно интересно. Как лучше всего отображать или размещать все эти разделы? Является ли представление стека подходящим способом, или я должен использовать табличное представление, или мне просто нужно иметь представление прокрутки с этими представлениями, связанными вместе, просто используя AutoLayout напрямую, или есть какой-то лучший способ сделать это, чем все это?

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

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

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

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

Обновление 2

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

На картинке здесь показано как расширение табличного представления, так и его свертывание. В свернутом виде видны три строки, а в развернутом — пять.

Желтые и синие представления представляют другие представления на странице. Они не являются частью этого представления и не являются частью представления стека, в котором они содержатся. Это просто другие части страницы, включенные сюда, чтобы показать эту проблему. Все представления здесь содержатся в представлении стека, и я думаю, что это вызывает проблему с анимацией, но я не уверен, как это исправить.

введите здесь описание изображения


person ashipma    schedule 07.05.2021    source источник
comment
Лучший обходной путь — использовать UICollectionView для настройки расширяемой таблицы, а при расширении просто вызовите reloadSections(_:with:), чтобы перезагрузить определенный раздел.   -  person pqteru    schedule 07.05.2021
comment
Из вашего вопроса неясно, что вы пытаетесь расширить/свернуть. Ваше анимированное изображение показывает движущиеся строки таблицы ... вы просто пытаетесь показать уже заполненное табличное представление?   -  person DonMag    schedule 07.05.2021
comment
@DonMag Извините за качество гифки, она слишком быстрая. Но происходит то, что мы начинаем с 3 строк, а затем, когда я расширяю таблицу, кажется, что таблица имеет свой frame.height перед добавлением каких-либо строк, а затем добавляет строки. Но это приводит к тому, что остальные разделы ниже этого раздела таблицы прыгают вниз, а не плавно анимируются. Я также попытался полностью заполнить таблицу, а затем добавить ограничение по высоте для таблицы, но это также вызвало прыжки из-за представления стека, в которое оно завернуто. Есть ли лучший способ размещения интерфейсов, чем использование представления стека?   -  person ashipma    schedule 07.05.2021
comment
@pqteru Вы хотите использовать UICollectionView для обработки макета приложения? Я пытался использовать UITableView со статическими ячейками, и до сих пор пытался использовать представление стека. Оба они вызывают у меня проблемы, когда мне нужно изменить размер одного из разделов (это может быть либо подкласс UIViewController, либо подкласс UIView). Но мне нужно иметь возможность поддерживать динамическое расширение и свертывание элементов в этих разделах, поэтому разделы должны иметь возможность увеличивать и уменьшать высоту. Я также пытаюсь поддерживать iOS 12+, но при необходимости могу отказаться от этого и поддерживать iOS 13+. Какую планировку порекомендуете?   -  person ashipma    schedule 07.05.2021
comment
@DonMag Или вы видите что-то не так с моим кодом? Когда я добавляю все строки в табличное представление, а затем просто устанавливаю высоту таблицы с помощью ограничения, а затем анимирую ее, это работает, если у меня установлено содержащее представление очень большой высоты (для этого раздела у меня есть UIView и внутри него у меня есть метка и таблица, как это показано в коде) чтобы не пришлось расширяться. Но если табличное представление должно растягивать содержащее его представление, тогда оно перестает работать правильно. Я просто пытаюсь настроить размер раздела автоматически и чтобы он мог плавно расширять и сворачивать таблицу по мере необходимости.   -  person ashipma    schedule 07.05.2021
comment
@ashipma - все еще не ясно, что вы хотите сделать ... Вы говорите, что ваш tableView находится в stackView ... вы пытаетесь отобразить больше/меньше строк в таблице? Или вы хотите, например, чтобы первые 3 строки всегда были видны, а остальные отображались/прятались?   -  person DonMag    schedule 07.05.2021
comment
@DonMag В этом разделе страницы показаны сведения о продукте, например, на снимках экрана показаны сведения об автомобиле. Деталей может быть много, поэтому, чтобы этот раздел не занимал слишком много места на странице, я хочу иметь кнопку для переключения между полным представлением таблицы (показывающим все строки) или сокращенным представлением таблицы (показывающим только может 3 ряда). Значит функционал должен быть такой: если ‹= 3 строки, то не показывать кнопку. Если › 3 строки показывают кнопку. Если кнопка нажата, то показать все строки. Если кнопка нажата снова, отобразятся только три строки. Спасибо за помощь.   -  person ashipma    schedule 07.05.2021
comment
@ashipma - есть ли причина, по которой вы не используете один tableView (с несколькими разделами, если необходимо)?   -  person DonMag    schedule 07.05.2021
comment
@DonMag Я новичок в разработке для iOS, поэтому я все еще пытаюсь во всем разобраться, но моя цель состоит в том, чтобы спроектировать это таким образом, чтобы каждый раздел находился в своем собственном представлении или контроллере представления, а затем был просто какой-то вид макета. контроллер, который принимает эти отдельные представления и отображает их. Я пытаюсь избежать того, чтобы все было в одном гигантском контроллере представления, если это возможно. И каждый раздел имеет действительно разное содержимое (некоторые разделы имеют табличное представление, некоторые имеют представление коллекции, некоторые имеют расширяемые строки таблицы, содержащие представление коллекции, тогда как другие содержат контроллеры страниц или просто метки.   -  person ashipma    schedule 07.05.2021
comment
@DonMag (продолжение) Но моя цель состоит в том, чтобы иметь что-то модульное, где я могу просто добавить к нему новое представление или контроллер представления, и этот контроллер представления будет реализован в другом месте. Я также хочу, чтобы каждый контроллер представления мог увеличиваться или уменьшаться по мере необходимости (в анимированном виде). Одна проблема, с которой я столкнулся при запуске этого проекта, заключалась в том, что я не был уверен, как это сделать, следует ли мне использовать табличное представление, или представление коллекции, или представление стека, или просто добавить каждый контроллер представления или представление непосредственно в представление прокрутки и использовать AutoLayout, или если бы был еще один способ справиться с этим. Какой подход вы рекомендуете?   -  person ashipma    schedule 07.05.2021
comment
@DonMag Я добавил раздел к вопросу под названием Update - a high level overview of what I am trying to do. Возможно, вы видели это в предыдущем вопросе, и он похож, но я немного обновил его с учетом моих общих целей. Но я не уверен, какой лучший подход к размещению этого контента, поэтому, если то, как я делаю это сейчас, неправильно, я могу изменить его. Но еще раз спасибо за все. Я очень ценю вашу помощь во всех моих вопросах.   -  person ashipma    schedule 07.05.2021


Ответы (1)


У вас действительно есть куча вопросов, но конкретно решить проблему с попыткой развернуть/свернуть представление таблицы...

Я думаю, что вы будете вести проигрышную битву с таким подходом. Пытаясь использовать представление таблицы с автоматическим изменением размера, вы противодействуете большей части поведения представления таблицы. И, поскольку вы не получаете преимущества управления памятью с помощью повторно используемых ячеек, вам, вероятно, лучше отформатировать свой список спецификаций. с вертикальным представлением стека.

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

Вот быстрый пример...

  • создать контейнер UIView
  • добавить вертикальное представление стека в контейнер
  • добавить метки в представление стека
  • добавьте красный UIView над контейнером
  • добавьте синий UIView, чтобы разместить его под контейнером
  • определить ограничения для высоты контейнера

При каждом касании контейнер будет расширяться/сворачиваться, чтобы показать/скрыть метки.

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
@end

@interface ViewController ()

@property (strong, nonatomic) NSLayoutConstraint *collapsedConstraint;
@property (strong, nonatomic) NSLayoutConstraint *expandedConstraint;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIStackView *labelsStackView = [UIStackView new];
    labelsStackView.axis = UILayoutConstraintAxisVertical;
    labelsStackView.spacing = 4;
    
    // let's add 12 labels to the stack view (12 "rows")
    for (int i = 1; i < 12; i++) {
        UILabel *v = [UILabel new];
        v.text = [NSString stringWithFormat:@"Label %d", i];
        [labelsStackView addArrangedSubview:v];
    }
    
    // add a view to show above the stack view
    UIView *redView = [UIView new];
    redView.backgroundColor = [UIColor redColor];
    
    // add a view to show below the stack view
    UIView *blueView = [UIView new];
    blueView.backgroundColor = [UIColor blueColor];

    // add a "container" view for the stack view
    UIView *cView = [UIView new];
    
    // clip the container's subviews
    cView.clipsToBounds = YES;
    
    for (UIView *v in @[redView, cView, blueView]) {
        v.translatesAutoresizingMaskIntoConstraints = NO;
        [self.view addSubview:v];
    }
    
    // add the stackView to the container
    labelsStackView.translatesAutoresizingMaskIntoConstraints = NO;
    [cView addSubview:labelsStackView];
    
    // constraints
    UILayoutGuide *g = [self.view safeAreaLayoutGuide];
    
    // when expanded, we'll use the full height of the stack view
    _expandedConstraint = [cView.bottomAnchor constraintEqualToAnchor:labelsStackView.bottomAnchor];
    
    // when collapsed, we'll use the bottom of the 3rd label in the stack view
    UILabel *v = labelsStackView.arrangedSubviews[2];
    _collapsedConstraint = [cView.bottomAnchor constraintEqualToAnchor:v.bottomAnchor];
    
    // start collapsed
    _expandedConstraint.priority = UILayoutPriorityDefaultLow;
    _collapsedConstraint.priority = UILayoutPriorityDefaultHigh;
    
    [NSLayoutConstraint activateConstraints:@[
        
        // redView Top / Leading / Trailing / Height=120
        [redView.topAnchor constraintEqualToAnchor:g.topAnchor constant:20.0],
        [redView.leadingAnchor constraintEqualToAnchor:g.leadingAnchor constant:20.0],
        [redView.trailingAnchor constraintEqualToAnchor:g.trailingAnchor constant:-20.0],
        [redView.heightAnchor constraintEqualToConstant:120.0],
        
        // container Top==redView.bottom / Leading / Trailing / no height
        [cView.topAnchor constraintEqualToAnchor:redView.bottomAnchor constant:0.0],
        [cView.leadingAnchor constraintEqualToAnchor:g.leadingAnchor constant:20.0],
        [cView.trailingAnchor constraintEqualToAnchor:g.trailingAnchor constant:-20.0],
        
        // blueView Top==stackView.bottom / Leading / Trailing / Height=160
        [blueView.topAnchor constraintEqualToAnchor:cView.bottomAnchor constant:0.0],
        [blueView.leadingAnchor constraintEqualToAnchor:g.leadingAnchor constant:20.0],
        [blueView.trailingAnchor constraintEqualToAnchor:g.trailingAnchor constant:-20.0],
        [blueView.heightAnchor constraintEqualToConstant:160.0],
        
        // stackView Top / Leading / Trailing
        [labelsStackView.topAnchor constraintEqualToAnchor:cView.topAnchor],
        [labelsStackView.leadingAnchor constraintEqualToAnchor:cView.leadingAnchor],
        [labelsStackView.trailingAnchor constraintEqualToAnchor:cView.trailingAnchor],

        _expandedConstraint,
        _collapsedConstraint,
        
    ]];

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

    // toggle priority between expanded / collapsed constraints
    if (_expandedConstraint.priority == UILayoutPriorityDefaultHigh) {
        _expandedConstraint.priority = UILayoutPriorityDefaultLow;
        _collapsedConstraint.priority = UILayoutPriorityDefaultHigh;
    } else {
        _collapsedConstraint.priority = UILayoutPriorityDefaultLow;
        _expandedConstraint.priority = UILayoutPriorityDefaultHigh;
    }
    // animate the change
    [UIView animateWithDuration:0.5 animations:^{
        [self.view layoutIfNeeded];
    }];
    
}

@end

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

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

Редактировать — здесь добавлен более сложный пример: https://github.com/DonMag/Scratch2021

Он использует вертикальное представление стека в виде вертикальной прокрутки в качестве пользовательского интерфейса основного представления, добавляя дочерние контроллеры представления в качестве компонентов в представлении стека.

введите здесь описание изображениявведите здесь описание изображения

person DonMag    schedule 07.05.2021
comment
Большое спасибо за вашу помощь здесь. Я попробую это. Но есть ли у вас какие-либо предложения о том, правильно ли я излагаю все это в целом (используя представление стека) или есть лучший способ? Вы упомянули преимущества памяти, которые я теряю, неправильно используя таблицу. Если бы вам нужно было создать подобную страницу (подумайте об этом как о странице продукта на розничном веб-сайте, где есть изображения, описания, обзоры и т. д.), как бы вы это сделали? Я бы хотел, чтобы он состоял из более мелких представлений, подобных этому, чтобы я мог сфокусировать каждое представление на одном и управлять им. Спасибо. - person ashipma; 08.05.2021
comment
Я только что попробовал ваше предложение обернуть табличное представление в UIView, а затем добавить к нему свернутые и расширенные нижние ограничения, и это работает, но при анимации представление родительского стека анимируется неправильно. У меня была эта проблема ранее, и я не мог ее решить. Общее представление, определенное этим классом, добавляется как упорядоченное подпредставление родительского представления стека, которое используется для компоновки всех разделов страницы. Я добавил обновление к вопросу под названием Обновление 2, в котором есть GIF-файл, показывающий анимацию. Знаете ли вы, есть ли какие-либо настройки в представлении стека, которые могут вызвать это? Спасибо. - person ashipma; 08.05.2021
comment
@ashipma - не видя вашей полной попытки, сложно сказать. Я привел более сложный пример, который ближе к вашему пользовательскому интерфейсу и подходу: github.com/DonMag/Scratch2021 - person DonMag; 08.05.2021
comment
Большое спасибо за то, что собрали все это вместе и потратили столько времени и сил на это. Я действительно ценю твою помощь. И снова вы решили мою проблему. Я добавил обход к корневому представлению (или в этом случае я мог бы просто остановиться на представлении родительского стека, я полагаю), и это все исправило. Я не совсем уверен, как представление стека работает внутри, но я думаю, что если мы анимируем что-либо, что изменяет высоту упорядоченного подпредставления, нам нужно компоновать все представление стека. Раньше я просто выкладывал подвид, и это не сработало. Еще раз спасибо. - person ashipma; 08.05.2021
comment
Привет, @DonMag - я только что опубликовал вопрос, похожий на этот (он снова об анимации для этого же проекта). На этот раз у меня есть раздел с табличным представлением, в котором есть расширяемые разделы. Каждый раздел содержит одну строку, которая представляет собой представление коллекции. Но анимация какая-то странная. Вам определенно не нужно смотреть на это, если вы этого не хотите, но я был бы очень признателен за любые ваши идеи или любые предложения по альтернативным решениям для этого. Большое спасибо. stackoverflow.com/ вопросы/67541899/ - person ashipma; 15.05.2021