web-dev-qa-db-ja.com

UITableViewCell問題の中央揃えテキスト

私はObjective-CとiPhoneの開発にちょっと慣れていないので、テキストを表のセルの中央に配置しようとすると問題に遭遇しました。私はグーグルを検索しましたが、解決策は修正された古いSDKのバグのためのものであり、これらは私のために機能しません。

いくつかのコード:

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

    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.text = @"Please center me";
    cell.textLabel.textAlignment = UITextAlignmentCenter;
    return cell;
}

上記はテキストを中央に配置しません。

WillDisplayCellメソッドも試しました:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.textLabel.textAlignment = UITextAlignmentCenter;
}

そして、私は古い投稿されたソリューションのいくつかを試しました:

UILabel* label = [[[cell contentView] subviews] objectAtIndex:0];
label.textAlignment = UITextAlignmentCenter;
return cell;

これらはいずれもテキストの配置に影響しません。私は、どんな助けも最も感謝されるだろうという考えを使い果たしました。

事前に乾杯。

63
Magpie

特定の問題に役立つかどうかはわかりませんが、initWithStyle:UITableViewCellStyleDefaultを使用するとUITextAlignmentCenterは機能します

125

textLabelは、指定されたテキストに必要な幅だけであるため、機能しません。 (UITableViewCellは、UITableViewCellStyleSubtitleスタイルに設定されたときに適切に見えるようにラベルを移動します)

LayoutSubviewsをオーバーライドして、ラベルが常にセルの幅全体を埋めるようにすることができます。

- (void) layoutSubviews
{
    [super layoutSubviews];
    self.textLabel.frame = CGRectMake(0, self.textLabel.frame.Origin.y, self.frame.size.width, self.textLabel.frame.size.height);
    self.detailTextLabel.frame = CGRectMake(0, self.detailTextLabel.frame.Origin.y, self.frame.size.width, self.detailTextLabel.frame.size.height);
}

detailTextLabelのテキストが空である限り、textLabelは垂直方向の中央に配置されるため、高さ/ y位置は必ず同じにしてください。

15
voidStern

このコードを使用してください:

cell.textLabel.textAlignment = NSTextAlignmentCenter;

上記のコードは機能します。UITextAlignmentCenterを使用しないでください。非推奨です。

5
Tejinder

このハックは、UITableViewCellStyleSubtitleを使用するときにテキストを中央揃えにします。両方のテキストラベルを文字列でロードし、セルを返す前にこれを実行します。各セルに独自のUILabelsを追加する方が簡単かもしれませんが、私は別の方法を見つけることに決めました...

// UITableViewCellStyleSubtitle measured font sizes: 18 bold, 14 normal

UIFont *font = [UIFont boldSystemFontOfSize:18]; // measured after the cell is rendered
CGSize size = [cell.textLabel.text sizeWithFont:font];
CGSize spaceSize = [@" " sizeWithFont:font];
float excess_width = ( cell.frame.size.width - 16 ) - size.width;
if ( cell.textLabel.text  &&  spaceSize.width > 0  &&  excess_width > 0 ) { // sanity
    int spaces_needed = (excess_width/2.0)/spaceSize.width;
    NSString *pad = [@"" stringByPaddingToLength:spaces_needed withString:@" " startingAtIndex:0];
    cell.textLabel.text = [pad stringByAppendingString:cell.textLabel.text]; // center the text
}

font = [UIFont systemFontOfSize:14]; // detail, measured
size = [cell.detailTextLabel.text sizeWithFont:font];
spaceSize = [@" " sizeWithFont:font];
excess_width = ( cell.frame.size.width - 16 ) - size.width;
if ( cell.detailTextLabel.text  &&  spaceSize.width > 0  &&  excess_width > 0 ) { // sanity
    int spaces_needed = (excess_width/2.0)/spaceSize.width;
    NSString *pad = [@"" stringByPaddingToLength:spaces_needed withString:@" " startingAtIndex:0];
    cell.detailTextLabel.text = [pad stringByAppendingString:cell.detailTextLabel.text]; // center the text
}
4
Jeff

コードを使用してテキストを中央に配置できます

cell.indentationLevel = 1;

cell.indentationWidth = [UIScreen mainScreen] .bounds.size.width/2-10;

0
dip

同じ状況で、カスタムラベルを持つカスタムUITableViewCellを作成しました。

MCCenterTextCell.hファイル:

#import <UIKit/UIKit.h>

@interface MCCenterTextCell : UITableViewCell

@property (nonatomic, strong) UILabel *mainLabel;

@end

MCCenterTextCell.mファイル:

 #import "MCCenterTextCell.h"


@interface MCCenterTextCell()


@end


@implementation MCCenterTextCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {

        self.accessoryType = UITableViewCellAccessoryNone;
        self.selectionStyle = UITableViewCellSelectionStyleGray;
        _mainLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 5, 320, 30)];
        _mainLabel.font = BOLD_FONT(13);
        _mainLabel.textAlignment = NSTextAlignmentCenter;
        [self.contentView addSubview:_mainLabel];

    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}


@end
0
wzbozon

CustomTableViewCell.m ::

- (void)layoutSubviews {
  [super layoutSubviews];

    self.textLabel.frame = CGRectMake(0, self.textLabel.frame.Origin.y, self.contentView.frame.size.width, self.textLabel.frame.size.height);

}

メソッドテーブル:

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

  CustomTableViewCell *cell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

  if (cell == nil) {
    cell = [[[CustomTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
  }

  cell.textLabel.text = @"Title";
  cell.textLabel.textAlignment = UITextAlignmentCenter;

  return cell;
}

必要であれば、self.detailTextLabelに対して同じことを繰り返すことができます

0
Alexander

ここに私のために働くものがあります...

NSString *text = @"some text";
CGSize size = [text sizeWithAttributes:@{NSFontAttributeName:SOME_UIFONT}];

[cell setIndentationLevel:1];
[cell setIndentationWidth:(tableView.frame.size.width - size.width)/2.0f];

cell.textLabel.font = SOME_UIFONT;
[cell.textLabel setText:text];
0
declan

テキストを右に揃えたい場合、説明したソリューションを適応させることに成功しました here

cell.transform = CGAffineTransformMakeScale(-1.0, 1.0);
cell.textLabel.transform = CGAffineTransformMakeScale(-1.0, 1.0);
cell.detailTextLabel.transform = CGAffineTransformMakeScale(-1.0, 1.0);
0
Tal Aloni