Автоматическое изменение размера заголовков UITableView при повороте (в основном на iPad)

Я чувствую, что это будет простой ответ, касающийся AutoResizingMasks, но я не могу осмыслить эту тему.

У меня есть приложение для iPad, которое показывает два UITableView рядом друг с другом. Когда я поворачиваюсь с книжной на альбомную и обратно, ячейки в UITableView полностью меняют размер, «на лету», пока происходит вращение. Я использую UITableViewCellStyleSubtitle UITableViewCells (на данный момент не подклассифицирован), и я установил UITableView в IB так, чтобы он привязался к верхнему, левому и нижнему краям (для левого UITableView) и имел гибкую ширину.

Я поставляю свой собственный объект UIView для

- (UIView *)tableView:(UITableView *)tableView 
     viewForHeaderInSection:(NSInteger)section

Вот что у меня есть (называется методом класса из другого класса):

+ (UIView *)headerForTableView:(UITableView *)tv
{
    // The view to return 
    UIView *headerView = [[UIView alloc] 
        initWithFrame:CGRectMake(0, 0, [tv frame].size.width, someHeight)];

    [headerView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | 
                                    UIViewAutoresizingFlexibleLeftMargin | 
                                    UIViewAutoresizingFlexibleRightMargin];

    // Other layout logic... doesn't seem to be the culprit

    // Return the HeaderView
    return headerView;
}

Итак, в любой ориентации все загружается так, как я хочу. После поворота, если я вручную вызываю reloadData или подожду, пока мое приложение не вызовет его, или прокручиваю UITableView, headerViews изменят размер и отобразятся должным образом. Я не могу понять, как правильно настроить свойство AutoResizeMask, чтобы размер заголовка изменялся точно так же, как и ячеек.


person mbm29414    schedule 20.10.2011    source источник
comment
Мне неясно из вашего вопроса: проблема в том, что ширина заголовков не меняется вместе с таблицей, что вы ожидаете, что их высота изменится, или что происходящие изменения не анимируются с поворотом таблицы?   -  person Sixten Otto    schedule 04.04.2013
comment
Я давно не смотрел это, но одна вещь сразу бросилась мне в глаза при просмотре. Я предполагаю, что моя проблема была связана с гибкой шириной и гибкими правыми и левыми полями. Кто знает, как предсказать поведение горизонтального изменения размера в таком сценарии? Я готов поспорить, что установка AutoResizingMask только на гибкую ширину была бы ответом. Опять же, как я уже сказал ниже, я перешел к совершенно другому решению.   -  person mbm29414    schedule 04.04.2013


Ответы (4)


Не очень хорошее исправление. Но работает:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    [super willAnimateRotationToInterfaceOrientation:toInterfaceOrientation duration:duration];
    [mTableView reloadData];
}
person ıɾuǝʞ    schedule 28.10.2011
comment
все используемые здесь методы являются общедоступными - person ıɾuǝʞ; 13.02.2012
comment
Я показываю изображение с выравниванием по правому краю, и это хорошее решение. Вот решение в Swift: переопределить func willAnimateRotationToInterfaceOrientation (toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {super.willAnimateRotationToInterfaceOrientation (toInterfaceOrientation, duration: duration) self.loadDatatable (). - person philippinedev; 20.10.2014

Недавно я столкнулся с той же проблемой. Уловка заключалась в том, чтобы использовать настраиваемое представление в качестве headerView таблицы. Переопределение layoutSubviews позволило мне управлять макетом по своему желанию. Ниже приведен пример.

#import "TableSectionHeader.h"

@implementation TableSectionHeader

- (id)initWithFrame:(CGRect)frame title:(NSString *)title
{
    self = [super initWithFrame:frame];
    if (self) {

        self.backgroundColor = [UIColor clearColor];

        // Initialization code
        headerLabel = [[UILabel alloc] initWithFrame:frame];
        headerLabel.text = title;

        headerLabel.textColor = [UIColor blackColor];
        headerLabel.font = [UIFont boldSystemFontOfSize:17];
        headerLabel.backgroundColor = [UIColor clearColor];

        [self addSubview:headerLabel];
    }
    return self;
}

-(void)dealloc {

    [headerLabel release];

    [super dealloc];
}

-(void)layoutSubviews {

    [super layoutSubviews];

    NSInteger xOffset = ((55.0f / 768.0f) * self.bounds.size.width);

    if (xOffset > 55.0f) {
        xOffset = 55.0f;
    }

    headerLabel.frame = CGRectMake(xOffset, 15, self.bounds.size.width - xOffset * 2, 20);
}

+(UIView *) tableSectionHeaderWithText:(NSString *) text bounds:(CGRect)bounds {
    TableSectionHeader *header = [[[TableSectionHeader alloc] initWithFrame:CGRectMake(0, 0, bounds.size.width, 40) title:text] autorelease];
    return header;
}

+(CGFloat) tableSectionHeaderHeight {
    return 40.0;
}
@end
person washfaq    schedule 09.10.2012

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

person mbm29414    schedule 28.10.2011
comment
Я пробовал вот так. Но сложно управлять ячейками, если у вас есть несколько видов ячеек и секций. - person Kimi Chiu; 29.01.2018

Я создал подкласс UIView, в котором я использовал визуальные ограничения, чтобы прикрепить подпредставление к сторонам экрана. И с вращением все в порядке.

class MLFlexibleView: UIView {

override init(frame: CGRect) {
    super.init(frame: frame)

    self.addSubview(self.segmentedControl)
    self.setUpConstraints()
}

func setUpConstraints() {
    let views = ["view" : self.segmentedControl]

    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "V:|-7-[view]-7-|", options: [], metrics: nil, views: views))
    NSLayoutConstraint.activate(NSLayoutConstraint.constraints(withVisualFormat: "H:|-15-[view]-15-|", options: [], metrics: nil, views: views))
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

let segmentedControl:UISegmentedControl = {
    let segmentedControl = UISegmentedControl(items: ["Searches".localized, "Adverts".localized])
    segmentedControl.selectedSegmentIndex = 0
    segmentedControl.tintColor = UIColor.white
    segmentedControl.translatesAutoresizingMaskIntoConstraints = false
    return segmentedControl
}()

}
person Mantas Laurinavičius    schedule 15.10.2016