1

Rubymotion を使用して iOS アプリを作成しています。このアプリでは、多くの行を持つテーブルビューを取得しました。各行はラベルを取得しました。メインコンテンツのラベルは高さが異なります。したがって、行の高さは (設計上) とは異なります。

問題は dequeueReusableCellWithIdentifier です。すべての行に同じ値を設定すると、行の重複や重複の問題が発生します。各行に一意の値を設定すると正常に動作しますが、スクロールのパフォーマンスは良くありません。

カスタム行 (異なる高さ) を処理する正しい方法は何ですか?

すべての入力に感謝します!

アップデート

これは私の heightForRowAtIndexPath:indexPath です

def tableView(tableView, heightForRowAtIndexPath:indexPath)

    object = @messages.objectAtIndex(indexPath.row)

    labelSize = object.message.sizeWithFont("Arial".uifont(14), constrainedToSize:[250.0, Float::MAX], lineBreakMode:UILineBreakModeWordWrap)

    labelSize.height + 88

  end

更新 2

def tableView(tableView, cellForRowAtIndexPath:indexPath)

    # Get row data and create row

    data = @messages[indexPath.row]

    # Create the label and add to view

    main_label = UILabel.new
    main_label.frame = [[10, 0],[250, 40]]
    main_label.text = data.sender
    main_label.font = "Arial".uifont(14)
    main_label.textColor = UIColor.blackColor
    main_label.backgroundColor = UIColor.clearColor
    main_label.tag = 1

    # Create the label and add to view

    sub_label = UILabel.new
    sub_label.frame = [[10, 35],[250, 40]]
    sub_label.text = data.message
    sub_label.font = "Arial".uifont(14)
    sub_label.textColor = UIColor.grayColor
    sub_label.backgroundColor = UIColor.clearColor
    sub_label.numberOfLines = 0
    sub_label.sizeToFit
    sub_label.tag = 2

    # Create the label and add to view

    time_label = UILabel.new
    time_label.frame = [[10, 2],[250, 21]]
    time_label.text = data.created_at_human
    time_label.font = "Arial".uifont(13)
    time_label.textColor = BubbleWrap.rgb_color(123, 137, 165)
    time_label.backgroundColor = UIColor.clearColor
    time_label.tag = 3

    # Create the main view

    main_view = UIView.alloc.initWithFrame([[10, 10],[300, sub_label.size.height + 50]])
    main_view.backgroundColor = UIColor.whiteColor
    main_view.addSubview(main_label)
    main_view.addSubview(sub_label)

    # Create the details view

    details_view = UIView.alloc.initWithFrame([[10, main_view.frame.size.height + 10],[300, 25]])
    details_view.backgroundColor = BubbleWrap.rgb_color(236, 239, 245)
    details_view.addSubview(time_label)                 

    # Create the cell

    cell = UITableViewCell.alloc.initWithStyle(UITableViewCellStyleDefault, reuseIdentifier:nil)
    cell.selectionStyle = UITableViewCellSelectionStyleNone

    # Set the data and return cell

    cell.addSubview(main_view)
    cell.addSubview(details_view)

  end
4

1 に答える 1

2

実装する必要があります

- (Float) tableView(tableView, heightForRowAtIndexPath:indexPath)

各セルの適切な高さを返します

def tableView tableView, heightForRowAtIndexPath: indexPath
  # calculate the required height
end

アップデート

わかりましたので、何が問題なのかがわかります。

このUITableViewCellような場合、おそらくサブクラスを作成してから、それを使用します。これは次のようになります

def tableView(tableView, cellForRowAtIndexPath:indexPath)
    cell = tableView.dequeueReusableCellWithIdentifier 'MyCell'
    unless cell
      cell = MyCell.alloc.initWithStyle(UITableViewCellStyleDefault, reuseIdentifier: 'MyCell')
    end

    data = @messages[indexPath.row]

    cell.main_label.text = data.sender
    cell.sub_label.text  = data.message
    # ...
end

または、サブクラス化したくない場合は、ビューを一度だけ追加するようにする必要があります。unlessこれは作成されたセルごとに 1 回だけ呼び出されるため、ブロック内でこれを行うことができますが、各サブビューを見つける方法が必要です。サブビューを見つける一般的な方法は使用してtagいますが、これは恐ろしいので、サブクラス化します

于 2013-02-11T19:30:07.583 に答える