Как получить сгруппированную ширину области содержимого UITableViewCell без использования константы - PullRequest
0 голосов
/ 08 марта 2011

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

Я использую стиль сгруппированного табличного представления. Я хочу встроить UITextField в вид ячейки. Я могу поместить текстовое поле в ячейку ОК (используя cell.AddSubview), но когда я использую сгруппированный стиль, текстовое поле находится в самом левом углу таблицы, а не там, где оно должно быть в белой области.

Я оглянулся (например, на образец UICatalog и ответы здесь), и все решения этой проблемы, кажется, включают жесткое кодирование постоянного смещения x для области границы. Это смещение x составляет около 35 пикселей на iPad, но составляет около 20 пикселей на iPhone.

Мне кажется, что должен быть лучший способ сделать это, но я еще не нашел его. Я пробовал смотреть на прямоугольники cell.Bounds, cell.Frame, cell.ContentView.Bounds и cell.ContentView.Frame - ни у одного из них нет «фактической» области содержимого сгруппированной ячейки.

У кого-нибудь есть другое предложение, или мне нужно жестко закодировать значение?

Спасибо

Ответы [ 2 ]

6 голосов
/ 10 июня 2011

добавьте UIViews к cell.contentView и установите autoResizeMask свойство для этого представления

вот пример создания cell с UILabel и UITextField:

// custom cell implementation
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{

    if ( (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) ) 
    {
        self.label = [[[UILabel alloc] init] autorelease];
        self.label.font = [UIFont fontWithName:@"Helvetica-Bold" size:17];
        self.label.backgroundColor = [UIColor clearColor];
        [self.contentView addSubview:self.label];

        self.textField = [[[UITextField alloc] init] autorelease];

        //this will make our textField resized properly 
        self.textField.autoresizingMask =  UIViewAutoresizingFlexibleWidth;

        self.textField.borderStyle = UITextBorderStyleNone;
        self.textField.backgroundColor = [UIColor clearColor];
        self.textField.textColor = [UIColor darkGrayColor]; //text color
        self.textField.font = [UIFont systemFontOfSize:17.0];  //font size
        self.textField.autocorrectionType = UITextAutocorrectionTypeNo; // no auto correction support

        self.textField.keyboardType = UIKeyboardTypeDefault;  // type of the keyboard
        self.textField.returnKeyType = UIReturnKeyNext;  // type of the return key

        self.textField.clearButtonMode = UITextFieldViewModeWhileEditing;   // has a clear 'x' button to the right

        [self.contentView addSubview:self.textField];
        self.selectionStyle = UITableViewCellSelectionStyleNone;
        self.accessoryType = UITableViewCellAccessoryNone;
    }
    return self;
}

и в методе источника данных

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

что-то в этом роде

            CustomCell* c = (CustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier1];
        if (c == nil) 
        {
            c = [[[CellWithPass alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier1] autorelease];
            c.textField.delegate = self;
        }
        //in this method cell and cell subviews are not resized, so
        //we are setting subviews frames here for cell with frame {{0,0},{320,44}}
        c.label.text = @"label";
        float w = [c.label.text sizeWithFont:c.label.font].width;
        c.label.frame = CGRectMake(10, 0, w, 44);
        c.textField.frame = CGRectMake(w + 10, 12, c.contentView.frame.size.width - w - 20, 20);
        return c;
1 голос
/ 26 мая 2011

Я тоже искал похожий ответ.

Мне еще предстоит найти какой-либо "хороший" ответ, но этот разговор проливает некоторый свет на то, почему вызов фрейма contentView не возвращает фактический фрейм за вычетом выделенной области аксессуара и заполнения закругленными краями:

Ширина содержимого вида UITableViewCell с данным типом аксессуара

Я воспользовался советом Барретта и просто скорректировал кадр в соответствии с жестко закодированными значениями, но был бы очень заинтересован, если бы вы нашли ответ, который лучше.

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