11

デフォルトの UITableViewCell を作成しました:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Init empty cell
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:GroupCellIdentifier];

    // Get the group info
    GroupInfo *groupInfo = (GroupInfo *)[_sortedGroupInfos objectAtIndex:[indexPath row]];

    // Check if we have initialized this cell before
    if(cell == nil)
    {
        // Initialize cell
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:GroupCellIdentifier];

        // Set the accessory type
        cell.accessoryType = UITableViewCellAccessoryNone;

        // Set the selection type
        cell.selectionStyle = [groupInfo.groupType isEqualToString:GroupTypePersonal] ? UITableViewCellSelectionStyleDefault : UITableViewCellSelectionStyleNone;

        // Set the indentation width
        cell.indentationWidth = 40;
    }

    // Set the label enabled status depending on the group type
    cell.textLabel.enabled = [groupInfo.groupType isEqualToString:GroupTypePersonal];
    cell.detailTextLabel.enabled = [groupInfo.groupType isEqualToString:GroupTypePersonal];

    // Set text
    cell.textLabel.text = groupInfo.description;
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%d %@", groupInfo.storeCount, [[Model instance] getTranslationFromSection:kSectionStoreSettings translationKey:@"Stores"]];

    // Set the image depending on the group type
    cell.imageView.image = [GroupInfo getImageForGroupType:groupInfo.groupType];

    // Return the cell
    return cell;
}

また、indentationLevelForRowAtIndexPath 関数も実装しました。

- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Get the group info
    GroupInfo *groupInfo = _sortedGroupInfos[[indexPath row]];

    // Return the indentation
    return groupInfo.indentation;
}

今、私は次のテーブルビューを取得します:

http://i40.tinypic.com/f3e63t.png

私の質問は: テーブル ビューのセルで画像がインデントされないのはなぜですか?

4

3 に答える 3

15

UITableViewCell をサブクラス化し、layoutSubViews メソッドをオーバーライドすることになりました。

- (void)layoutSubviews
{
    // Call super
    [super layoutSubviews];

    // Update the separator
    self.separatorInset = UIEdgeInsetsMake(0, (self.indentationLevel * self.indentationWidth) + 15, 0, 0);

    // Update the frame of the image view
    self.imageView.frame = CGRectMake(self.imageView.frame.origin.x + (self.indentationLevel * self.indentationWidth), self.imageView.frame.origin.y, self.imageView.frame.size.width, self.imageView.frame.size.height);

    // Update the frame of the text label
    self.textLabel.frame = CGRectMake(self.imageView.frame.origin.x + 40, self.textLabel.frame.origin.y, self.frame.size.width - (self.imageView.frame.origin.x + 60), self.textLabel.frame.size.height);

    // Update the frame of the subtitle label
    self.detailTextLabel.frame = CGRectMake(self.imageView.frame.origin.x + 40, self.detailTextLabel.frame.origin.y, self.frame.size.width - (self.imageView.frame.origin.x + 60), self.detailTextLabel.frame.size.height);
}

私のテーブルビューは次のようになります。

http://tinypic.com/r/24y20if/5

于 2013-11-06T09:13:00.213 に答える
6

私は画像のインデントだけを探していましたが、最終的に Swift に実装することに成功しました。ありがとうございました!ただし、Int と CGFloat の間の変換にはいくつかの問題がありました。Swift でも同じことが次のように機能しました。

class CustomUITableViewCell: UITableViewCell
{
    override func layoutSubviews() {
    // Call super
    super.layoutSubviews();

    // Update the frame of the image view
    self.imageView!.frame = CGRectMake(self.imageView!.frame.origin.x + (CGFloat(self.indentationLevel) * self.indentationWidth), self.imageView!.frame.origin.y, self.imageView!.frame.size.width, self.imageView!.frame.size.height);
    }
}
于 2015-08-20T07:18:16.707 に答える
3

ロベルトはかなり良い解決策を投稿しました。ただし、セルの表示中に layoutSubviews が複数回呼び出されると、セルのコンテンツが右に移動します。

追加することで問題を解決できました

static CGFloat imageViewXOrigin = 0;
if(imageViewXOrigin == 0)
    imageViewXOrigin = self.imageView.frame.origin.x;

フレーム計算呼び出しの前、およびすべての置換

self.imageView.frame.origin.x 

imageViewXOrigin

変数。

于 2015-02-05T09:19:28.747 に答える