6

奇妙な問題に遭遇しました。テーブルビュー用のカスタム選択ビューを作成しています。ただし、この選択ビューはうまく適合しません。これは、セル自体が 320px であるのに対し、選択ビューが 300px であるためであることがわかりました。奇妙な部分は、UITableViewの幅が実際には 300px しかないことです。表のセル幅を調整するにはどうすればよいですか?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   static NSString *tableIdentifier = @"Cell";

   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:tableIdentifier];

  if (cell == nil)
    cell = [[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:tableIdentifier] autorelease];


  if (tableView == bandTable)
  {
    UIImageView *imageBg = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"column1_selected.png"]];
    [imageBg setAutoresizingMask:UIViewAutoresizingFlexibleWidth];

    [tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [cell setSelectionStyle:UITableViewCellSelectionStyleGray];
    [cell setSelectedBackgroundView:imageBg];
    [imageBg release];

    NSArray *array = [bandDictionary objectForKey:@"Bands"];

    cell.textLabel.text = [array objectAtIndex:indexPath.row];
    NSLog(@"CELL: %f", cell.bounds.size.width);
  }
  return cell;
}
4

4 に答える 4

4

設定するだけ

cell.frame = CGRectMake(0,
                        0,
                        self.tableView.frame.size.width,
                        cell.frame.size.height);

cellForRowAtIndexPath

于 2012-10-23T09:14:10.803 に答える
0

@IvorPrebeg、UITableViewCell内側のフレームを設定しないでくださいcellForRowAtIndexPath。はUITableViewCell自動的に実行UITableView後の幅に設定されます。これは、 に挿入したラベルに値を設定すると、自動的に行われます。celllayoutSubviewscell

フォントに基づいてサイズ内で計算することが重要であり、セル内heightForRowAtIndexPathのテキストと同じです。cell私の場合、次のようになります。

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath{+
    ChatMessage *message = 
     [self.fetchedResultsController objectAtIndexPath:indexPath];

    CGSize size = [message.text sizeWithFont:self.messageCell.labelMessage.font
                       constrainedToSize:CGSizeMake(self.tableView.frame.size.width * 0.8f, HUGE_VAL)
                           lineBreakMode:NSLineBreakByWordWrapping];

    return size.height;
}

そして、内部よりUITableViewCell:

- (void)layoutSubviews{
    [super layoutSubviews];

    if( _fInitWidth == 0 ){
        self.labelMessage.preferredMaxLayoutWidth = 
           self.bounds.size.width * 0.8f;
    }    
    [self.contentView setNeedsDisplay];
}

ご覧のとおりprefferedMaxLayoutWidthUILabel内側UITableViewCellの はcells幅の 0.8 (320 * 0.8) になります。セルのプロパティを設定した後、LayoutSubviews内部で実行されます。cellForRowAtIndexその後、UITableViewを呼び出しheightForRowAtIndexPathて高さのサイズを計算します。したがって、 と同じ (テーブルビューの幅は 320.0 * 0.8) にUILabels幅 * 0.8 を渡してサイズを計算します。constrainedToSizecell

値の例は iPhone デバイス用です。もちろん、より大きな画面では変更されます。

于 2015-03-25T11:58:02.000 に答える