Выровняйте ячейки по нижней и верхней части UITableView, оставляя растягиваемый промежуток в середине - PullRequest
5 голосов
/ 05 марта 2010

У меня есть табличное представление с пятью ячейками, отображающими настройки моего приложения.Я хочу, чтобы первые четыре ячейки появились сверху.Последняя ячейка на самом деле не является настройкой, она говорит «Законно» и переводит вас в EULA, поэтому я хочу, чтобы она отображалась внизу.

Теперь я знаю, что могу использовать – tableView:viewForHeaderInSection: и – tableView:heightForHeaderInSection: чтобы создать некоторые отступы, но мне действительно не нравится жесткое кодирование в измерениях таким образом.Я также не хочу использовать UIButton, потому что я хочу, чтобы он был в том же стиле, что и остальные ячейки.

Кто-нибудь знает лучшую практику для этого?

1 Ответ

13 голосов
/ 11 марта 2010

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

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

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

    return 3; 
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    int rtn = 0;

    if (section == 0)
        rtn = 4;
    else if (section == 1)
        rtn = 1;
    else if (section == 2)
        rtn = 1;

    return rtn;
}

/*
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
    return 44.0f;
}
*/

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    int TOTALCELLS = 6;
    float CONSTANT = 0.5f;

    if (indexPath.section == 1) 
        return  self.view.frame.size.height - (44.0f * (CONSTANT + TOTALCELLS));

    return 44.0f;
}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {


    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];

    }



    if (indexPath.section == 0) 
    {
        if (indexPath.row == 0) {

            cell.textLabel.text = @"My Switch";
            UISwitch *boolSwitch = [[UISwitch alloc]initWithFrame:CGRectZero];
            boolSwitch.on =  YES;
            [cell setAccessoryView:boolSwitch];
            [boolSwitch release];

        } else if (indexPath.row == 1) {

            cell.textLabel.text = @"My TxtField";
            [cell setSelectionStyle:UITableViewCellSelectionStyleNone];
            UITextField *txtField = [[UITextField alloc]initWithFrame:CGRectMake(0,0,175,20)]; 
            txtField.text =  @"Default Value";
            txtField.textColor = [UIColor darkGrayColor];
            [txtField setClearButtonMode:UITextFieldViewModeAlways];
            [cell setAccessoryView:txtField];
            [txtField release];

        } else if (indexPath.row == 2) {

            cell.selectionStyle=UITableViewCellSelectionStyleNone;
            UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(0,0,280,22)];
            slider.minimumValue  = 0.0f;
            slider.maximumValue = 10.0f;
            slider.value =  0.7f;
            slider.minimumValueImage = [UIImage imageNamed:@"minus.png"];
            slider.maximumValueImage = [UIImage imageNamed:@"plus.png"];
            [cell setAccessoryView:slider];
            [slider addTarget:self action:@selector(sliderChange:forEvent:) forControlEvents:UIControlEventValueChanged];
            [slider release];

        } else if (indexPath.row == 3) {

            cell.textLabel.text = @"My MultiValue";
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            cell.detailTextLabel.text = @"Default selection";
        }

    } else if (indexPath.section == 1) {

        UIView *transCell = [[UIView alloc] initWithFrame:CGRectZero];
        transCell.backgroundColor = [UIColor clearColor];
        cell.backgroundView = transCell; 
        [transCell release];
        [cell setSelectionStyle:UITableViewCellSelectionStyleNone];

    } else if (indexPath.section == 2) {

        cell.textLabel.text = @"Legal";
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }



    return cell;
}

Критические части находятся в cellForRowAtIndexPath, где создается прозрачная строка. Хитрость заключается в том, чтобы добавить прозрачное представление к backgroundView ячейки и установить стиль выбора ячейки на None.

UIView *transCell = [[UIView alloc] initWithFrame:CGRectZero];
transCell.backgroundColor = [UIColor clearColor];
cell.backgroundView = transCell; 
[transCell release];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];

и в heightForRowAtIndexPath - динамическое изменение размера прозрачной строки.

self.view.frame.size.height - (44.0f * (CONSTANT + TOTALCELLS));

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

Я надеюсь, что это работает для вас.

Valid XHTML

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