Как изменить размер tableHeaderView UITableView? - PullRequest
98 голосов
/ 04 декабря 2008

У меня проблемы с изменением размера tableHeaderView. Это просто не работает.

1) Создание UITableView и UIView (100 x 320 px);

2) Установить UIView в качестве tableHeaderView UITableView;

3) Build and Go. Все в порядке.

Теперь я хочу изменить размер tableHeaderView, поэтому я добавляю этот код в viewDidLoad:

self.tableView.autoresizesSubviews = YES;

self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;

CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;

Высота tableHeaderView должна отображаться с 200, но отображается с 100.

Если я напишу:

self.tableView.autoresizesSubviews = YES;


CGRect newFrame = myHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
myHeaderView.frame = newFrame;


self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;

Тогда начинается с 200, как я хочу. Но я хочу иметь возможность изменять его во время выполнения.

Я тоже пытался, но безуспешно:

self.tableView.autoresizesSubviews = YES;

self.tableView.tableHeaderView = myHeaderView;
self.tableView.tableFooterView = myFooterView;

CGRect newFrame = self.tableView.tableHeaderView.frame;
newFrame.size.height = newFrame.size.height + 100;
self.tableView.tableHeaderView.frame = newFrame;

[self.tableView.tableHeaderView setNeedsLayout];
[self.tableView.tableHeaderView setNeedsDisplay];
[self.tableView setNeedsLayout];
[self.tableView setNeedsDisplay];

Суть в следующем: Как мы изменяем размер tableHeaderView во время выполнения ???

Кто-нибудь мог это сделать?

Спасибо

IME

Ответы [ 18 ]

0 голосов
/ 30 декабря 2017

Очевидно, что к настоящему времени Apple должна была реализовать UITableViewAutomaticDimension для tableHeaderView & tableFooterView ...

Мне кажется, что следующее работает с использованием макетов:

CGSize   s  = [ self  systemLayoutSizeFittingSize : UILayoutFittingCompressedSize ];
CGRect   f  = [ self  frame ];

f.size   = s;

[ self  setFrame : f ];
0 голосов
/ 06 июня 2016

Если настраиваемый headerView разработан с использованием autolayout, а headerView необходимо обновить после веб-выборки или аналогичной отложенной задачи. затем в iOS-Swift я сделал это и обновил свой headerView, используя приведенный ниже код:

//to reload your cell data
self.tableView.reloadData()
dispatch_async(dispatch_get_main_queue(),{
// this is needed to update a specific tableview's headerview layout on main queue otherwise it's won't update perfectly cause reloaddata() is called
  self.tableView.beginUpdates()
  self.tableView.endUpdates()
} 
0 голосов
/ 06 июня 2015

Заголовок изменения размера UITableView - UISearchBar с областью действия

Я хотел UITableView с UISearchBar в качестве заголовка таблицы, поэтому у меня есть иерархия, которая выглядит следующим образом

UITableView
  |
  |--> UIView
  |     |--> UISearchBar
  |
  |--> UITableViewCells

UISearchBarDelegate методы

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

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar
{
    searchBar.showsScopeBar = YES;
    [UIView animateWithDuration:0.2f animations:^{
        [searchBar sizeToFit];
        CGFloat height = CGRectGetHeight(searchBar.frame);

        CGRect frame = self.tableView.tableHeaderView.frame;
        frame.size.height = height;
        self.tableHeaderView.frame = frame;
        self.tableView.tableHeaderView = self.tableHeaderView;
    }];

    [searchBar setShowsCancelButton:YES animated:YES];
    return YES;
}

- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar
{
    searchBar.showsScopeBar = NO;
    [UIView animateWithDuration:0.f animations:^{
        [searchBar sizeToFit];

        CGFloat height = CGRectGetHeight(searchBar.frame);

        CGRect frame = self.tableView.tableHeaderView.frame;
        frame.size.height = height;
        self.tableHeaderView.frame = frame;
        self.tableView.tableHeaderView = self.tableHeaderView;
    }];

    [searchBar setShowsCancelButton:NO animated:YES];
    return YES;
}
0 голосов
/ 21 сентября 2014

Я реализовал анимированное изменение высоты заголовка таблицы для расширения до общего экрана при нажатии. Однако код может помочь в других случаях:

// Swift
@IBAction func tapped(sender: UITapGestureRecognizer) {

    self.tableView.beginUpdates()       // Required to update cells. 

    // Collapse table header to original height
    if isHeaderExpandedToFullScreen {   

        UIView.animateWithDuration(0.5, animations: { () -> Void in
            self.scrollView.frame.size.height = 110   // original height in my case is 110
        })

    }
    // Expand table header to overall screen            
    else {      
        let screenSize = self.view.frame           // "screen" size

        UIView.animateWithDuration(0.5, animations: { () -> Void in
            self.scrollView.frame.size.height = screenSize.height
        })
    }

    self.tableView.endUpdates()  // Required to update cells. 

    isHeaderExpandedToFullScreen= !isHeaderExpandedToFullScreen  // Toggle
}
0 голосов
/ 05 декабря 2010

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

 - (id)initWithFrame:(CGRect)aRect {

    CGRect frame = [[UIScreen mainScreen] applicationFrame];

    if ((self = [super initWithFrame:CGRectZero])) {

        // Ugly initialization behavior - initWithFrame will not properly honor the frame we pass
        self.frame = CGRectMake(0, 0, frame.size.width, 200);

        // ...
    }
}

Преимущество этого в том, что он лучше инкапсулирован в код вашего представления.

0 голосов
/ 27 сентября 2018

Если ваш tableHeaderView является настраиваемым веб-представлением, вы можете попробовать:

[self.webView.scrollView addObserver:self forKeyPath:@"contentSize" options:NSKeyValueObservingOptionNew context:nil];

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context {
    self.webView.height = self.webView.scrollView.contentSize.height;
    self.tableView.tableHeaderView = self.webView;
}

Я тестировал его на iOS9 и iOS11, работал хорошо.

0 голосов
/ 22 ноября 2018

Это только для случаев, когда вы используете автоматическое расположение и задаете translatesAutoresizingMaskIntoConstraints = false для настраиваемого представления заголовка.

Лучший и самый простой способ - переопределить intrinsicContentSize. Внутренне UITableView использует intrinsicContentSize для определения размера верхнего / нижнего колонтитула. После того, как вы изменили intrinsicContentSize в своем пользовательском представлении, вам нужно сделать следующее:

  1. настроить макет пользовательского верхнего / нижнего колонтитула (подпредставления)
  2. invoke invalidateIntrinsicContentSize()
  3. вызывает tableView.setNeedsLayout() и tableView.layoutIfNeeded()

Тогда верхний / нижний колонтитул UITableView будет обновляться по вашему желанию. Нет необходимости устанавливать вид ноль или сбросить.

Одна вещь, действительно интересная для UITableView.tableHeaderView или .tableFooterView, заключается в том, что UIStackView теряет способность управлять arrangedSubviews. Если вы хотите использовать UIStackView в качестве tableHeaderView или tableFooterView, вам нужно встроить stackView в UIView и переопределить UIView intrinsicContentSize.

0 голосов
/ 05 декабря 2008

ты пробовал [self.tableView reloadData] после изменения высоты?

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