2009-05-22 2 views
6

Я пытаюсь получить UISegmentedControl в группе UITableViewCell так же, как в настройках wifi в приложении настройки. Проблема, с которой я столкнулась, - это получить двойную границу. Я получаю одну границу для UISegmentedControl и одну для UITableViewCell.UITableViewCell/UISegmentedControl border issue

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

+2

Незначительное предложение стиль: используя правильную капитализацию имена классов в заголовке вопроса сделают его намного более легким для чтения. Вы можете изменить его после факта. Извините, у меня нет ответа, на данный момент я занимаюсь только настольными приложениями. –

ответ

7

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

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]; 
+1

@ daniel-wood: Номера, которые вы дали, подходят для портретного режима, но не будут работать в ландшафте. Голосование за вас: –

+0

А, правда. Я думаю, вы могли бы сделать tableView.frame.size.width - 18.0f для ширины. Все остальные значения должны быть одинаковыми. –

1

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

0

Целью настоящего изобретения является размер 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 образца кода в the SDK, они эффективны «обмануть», используя UIViewController и настройку основного вида по цвету фона в таблице цвета фона)

+0

Сводный код сегментарного кода, на который вы ссылаетесь, использует общий вид, а не представление таблицы, для отображения его элементов управления; это выглядит как сгруппированный стол, потому что он использует этот фоновый цвет. –

+0

Вникнул в него и нашел правильный ответ. Упоминался мой старый ответ, так что другие знают, что пример Apple на самом деле этого не делает. –

3

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

2

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

+0

Это правильный способ сделать это - создать рамку элемента управления так же, как 'cell.contentView.bounds', установить' autoresizingMask' в 'UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight', добавьте элемент управления в качестве поднабора 'cell.contentView' и установите' cell.backgroundView' в прозрачный 'UIView'. –

1

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

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

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