Как центрировать нижний колонтитул раздела UITableView с поддержкой ориентации? - PullRequest
2 голосов
/ 23 июня 2011

EDIT: После того, как я возился с этим в течение нескольких дней, у меня возникли следующие вопросы: 1. UITableView занимает весь вид?
2. Если это так, как он устанавливает границы ячеек так, чтобы они выглядели так, как будто они занимают только часть вида. 3. Как я могу получить границы ячеек или, точнее, как узнать границы видимой области, которую занимают клетки. self.tableView.bounds.size.width не помогает, потому что он возвращает ширину представления. Благодарю. Оставьте предыдущую информацию ниже, если она поможет прояснить мой вопрос.

Может ли это быть возможно? Я читал яблочные документы и проверял форумы здесь и в других местах и ​​не могу найти и ответить на это. Действительно ли нижний колонтитул в UITableVIew занимает весь просмотр независимо от того, что вы делаете? Разве у него нет понятия ширины стола?

Пример:

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section {
    UIView *footerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
    [footerView setBackgroundColor:[UIColor redColor]];

    return footerView;
}

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

if ([footerText length] > 0) {
    UIView *customView = [[[UIView alloc]initWithFrame:CGRectMake(0.0, 0.0, 0, 0.0)] autorelease];

    [customView setBackgroundColor:[UIColor grayColor]];

    UILabel *footerLabel = [[UILabel alloc] initWithFrame:CGRectZero];
    footerLabel.numberOfLines = 2;
    footerLabel.adjustsFontSizeToFitWidth = NO;
    [footerLabel setTextAlignment:UITextAlignmentCenter];
    [footerLabel setBackgroundColor:[UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.5]];
    [footerLabel setOpaque:NO];
    [footerLabel setTextColor:[UIColor whiteColor]];
    [footerLabel setShadowColor:[UIColor lightGrayColor]];
    [footerLabel setFont:[UIFont boldSystemFontOfSize:14]];
    [footerLabel setFrame:CGRectMake(customView.center.x/0.3, 0.0, 600, 40.0)];
    [footerLabel setText:footerText];
    [customView addSubview:footerLabel];
    [footerLabel release];

    NSLog(@"customView width = %f", customView.frame.size.width);
    NSLog(@"tableview width = %f", self.tableView.frame.size.width);
    NSLog(@"tableview center = %f", self.tableView.center.x);

    return customView;
} else {
    return nil;
}

Центр таблицы в портретной ориентации должен быть 384 (это в подробном представлении / справа) и 351,5 в альбомной ориентации. Но когда я использую setCenter или пытаюсь отрегулировать левый край на основе этого центра, он не центрируется.

Последний вопрос: как можно центрировать пользовательское представление в нижнем колонтитуле с поддержкой ориентации, когда, кажется, что нижний колонтитул не имеет понятия границ таблицы? Я должен что-то упустить в документах, потому что это должна быть проблема, решаемая кем-то другим, но я не могу найти это. Спасибо за ваше время.

1 Ответ

7 голосов
/ 06 августа 2011

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

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

например:

- (UIView *) tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
{
    static UIView *footerView;

    if (footerView != nil)
        return footerView;

    NSString *footerText = NSLocalizedString(@"Some Display Text Key", nil);

    // set the container width to a known value so that we can center a label in it
    // it will get resized by the tableview since we set autoresizeflags
    float footerWidth = 150.0f;
    float padding = 10.0f; // an arbitrary amount to center the label in the container

    footerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, footerWidth, 44.0f)];
    footerView.autoresizingMask = UIViewAutoresizingFlexibleWidth;

    // create the label centered in the container, then set the appropriate autoresize mask
    UILabel *footerLabel = [[[UILabel alloc] initWithFrame:CGRectMake(padding, 0, footerWidth - 2.0f * padding, 44.0f)] autorelease];
    footerLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
    footerLabel.textAlignment = UITextAlignmentCenter;
    footerLabel.text = footerText;

    [footerView addSubview:footerLabel];

    return footerView;
}
...