私は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;
これらはいずれもテキストの配置に影響しません。私は、どんな助けも最も感謝されるだろうという考えを使い果たしました。
事前に乾杯。
特定の問題に役立つかどうかはわかりませんが、initWithStyle:UITableViewCellStyleDefault
を使用するとUITextAlignmentCenter
は機能します
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位置は必ず同じにしてください。
このコードを使用してください:
cell.textLabel.textAlignment = NSTextAlignmentCenter;
上記のコードは機能します。UITextAlignmentCenterを使用しないでください。非推奨です。
このハックは、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
}
コードを使用してテキストを中央に配置できます
cell.indentationLevel = 1;
cell.indentationWidth = [UIScreen mainScreen] .bounds.size.width/2-10;
同じ状況で、カスタムラベルを持つカスタム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
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
に対して同じことを繰り返すことができます
ここに私のために働くものがあります...
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];
テキストを右に揃えたい場合、説明したソリューションを適応させることに成功しました here 。
cell.transform = CGAffineTransformMakeScale(-1.0, 1.0);
cell.textLabel.transform = CGAffineTransformMakeScale(-1.0, 1.0);
cell.detailTextLabel.transform = CGAffineTransformMakeScale(-1.0, 1.0);