UITableViewCell / UISegmentedControl проблема с границей - PullRequest
6 голосов
/ 22 мая 2009

Я пытаюсь получить UISegmentedControl в группе UITableViewCell так же, как в настройках Wi-Fi в настройках приложения. У меня проблема в том, что я получаю двойную границу. Я получаю одну границу для UISegmentedControl и одну для UITableViewCell.

Полагаю, мне нужно убрать границу из UITableViewCell. Как я могу это сделать?

Ответы [ 6 ]

7 голосов
/ 28 декабря 2009

Я только что заметил, что это все еще получает ответы. Как это случилось, мне пришлось сделать это для другого проекта, и с тех пор, как я задал этот вопрос, я узнал намного больше о разработке для iPhone. Вот как я решил это недавно. Все дело в том, чтобы сделать кадр правильного размера. Это должно сделать это для стандартной таблицы.

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];
if(cell == nil) 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier"] autorelease];

UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithFrame:CGRectMake(-1.0f, -1.0f, 302.0f, 46.0f)];
[cell.contentView addSubview:segmentedControl];
3 голосов
/ 25 декабря 2009

В случае настроек Wi-Fi, я подозреваю, что они сделали, сделали кнопку «Забыть эту сеть», метку «IP-адрес» и сегментированный элемент управления «DHCP / BootP / Static» для всех частей. представления заголовка таблицы. Если вам нужно сделать это в середине таблицы (в отличие от верха или низа, для которого вы будете использовать свойства tableHeaderView и tableFooterView соответственно), я бы предложил использовать методы делегата -tableView:viewForHeaderInSection: с -tableView:heightForHeaderInSection или соответствующими Footer вариантами. С любым из них вы бы настроили пользовательское представление для этого «раздела» вашего табличного представления (используя либо чистый фоновый цвет, либо [UIColor groupTableBackgroundColor]), содержащее метку и сегментированный элемент управления, расположенные так, чтобы они совпадали с остальные разделы таблицы.

2 голосов
/ 14 декабря 2011

Используя технику из этого поста , чтобы убрать непрозрачность фона UITableViewCell, мне было легче получить только UISegmentedControl для отображения в строке таблицы.

1 голос
/ 29 марта 2012

Мое решение состоит в том, чтобы позволить сегментированному элементу управления изменить размер, чтобы соответствовать, и скрыть фон табличного представления в tableView:willDisplayCell:forRowAtIndexPath:.

Это дает результаты, идентичные сегментированному элементу управления «Settings.app> WiFi> Ваша сеть> IP-адрес» без жесткого кодирования каких-либо показателей макета:

- (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];
    }

    UISegmentedControl *control = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", @"Three", nil]];
    control.segmentedControlStyle = UISegmentedControlStylePlain;
    control.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
    control.frame = cell.contentView.bounds;
    [cell.contentView addSubview:control];
    [control release];
}

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundView.alpha = 0.0;
}
1 голос
/ 22 мая 2009

У меня есть немного дальше с этим. До сих пор я подкласс UITableViewCell. Я создал перо с UISegmentedControl в нем и установил альфа-фон UITableViewCell на 0. Он по-прежнему выглядит не совсем правильно, но лучше, чем раньше.

0 голосов
/ 25 декабря 2009

Хитрость заключается в определении размера UISegmentedControl в соответствии с размером backgroundView элемента управления, а не contentView. Я смог сделать это программно, выполнив следующее:

    // Size to cover the entire background
    self.contentView.frame = self.backgroundView.frame;
    self.myControl.frame = self.contentView.bounds;

Обратите внимание, что если вы используете аксессуар, вам также необходимо учитывать accessoryView.

Причина в том, что иерархия представления выглядит следующим образом:

  • self ( UITableViewCell или подкласс)
    • backgroundView
    • contentView
      • (ваш контроль здесь)
    • accessoryView

В портретной раскладке кадр backgroundView равен {{9, 0}, {302, 44}}, тогда как кадр contentView немного меньше и равен {{10, 1}, {300, 42}}. Это дает ячейке ее 1px "границу", когда стиль таблицы сгруппирован. Вы должны изменить размеры элемента управления contentView и , чтобы получить соответствующий размер.

(ПРИМЕЧАНИЕ. Хотя Apple на самом деле имеет несколько примеров UISegmentedControl в проекте примера кода UICatalog в SDK , они фактически "обманывают", используя a UIViewController и установка цвета фона основного представления на цвет фона таблицы.)

...