ラベルが 2 つ積み上げられたプロトタイプ セルの後に、最大 3 つのボタンを含むビューが続きます。任意のセルで 0、1、2、または 3 個のボタンが表示される可能性があります (Web xml ファイルに基づく)。レイアウトは次のようにしてほしいです(Xはボタンを表します)
3つのボタン
| |
| X X X |
| |
2 ボタン
| |
| X X |
| |
1 ボタン
| |
| X |
| |
テーブル セル コードは、セル内のボタンの総数に応じて各ボタンのフレームを設定します。ただし、セルが 2 回目に読み込まれるまで、フレームは機能しているように見えます (つまり、セルが範囲外になるようにスクロールしてからセルに戻ります)。前回これが発生したのは、レイアウトの制約によるものでした。質問は、各ボタンが多くの場所に配置できるように、ストーリーボードで制約を設定するにはどうすればよいですか? 現在、各ボタンはボタン ビューの上部、下部、および前縁に固定されています。リーディング エッジの制約が問題の原因であることはわかっていますが、ストーリーボードによって強制されるため、代わりに何を使用すればよいかわかりません。または、私の cellForRowAtIndexPath メソッドでできることはありますか? そのメソッドの関連コードは次のとおりです
static NSString *CellIdentifier = @"localdiningTableCell";
mhgiLocalDiningCell *diningcell = (mhgiLocalDiningCell*)[tableView
dequeueReusableCellWithIdentifier:CellIdentifier];
if (diningcell == nil) {
diningcell = [[mhgiLocalDiningCell alloc]
initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:CellIdentifier];
}
mhgiDiningXmlObject *object = [self.xmlParser.allItems objectAtIndex:[indexPath row]];
CGSize constraintSize = CGSizeMake(280.0f, MAXFLOAT);
CGSize labelSize = [[object Name] sizeWithFont:diningcell.nameLabel.font constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping];
CGRect frame = CGRectMake (10, 10, 280.0f, labelSize.height);
diningcell.nameLabel.frame = frame;
diningcell.nameLabel.lineBreakMode = NSLineBreakByWordWrapping;
diningcell.nameLabel.numberOfLines = 0;
diningcell.nameLabel.text= [object Name];
CGFloat nextYVal = diningcell.nameLabel.frame.origin.y + diningcell.nameLabel.frame.size.height + 10.0f;
NSString *descrText = @"";
if (![[object Type] isEqualToString:@""]){
descrText = [descrText stringByAppendingString:[object Type]];
descrText = [descrText stringByAppendingString:@"\n"];
}
descrText = [descrText stringByAppendingString:[NSString stringWithFormat:@"%@, %@, %@", [object Street], [object City], [object State]]];
descrText = [descrText stringByAppendingString:@"\n"];
descrText = [descrText stringByAppendingString:[NSString stringWithFormat:@"%@ miles from the hotel", [object Distance]]];
labelSize = [descrText sizeWithFont:diningcell.typeLabel.font constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping];
frame = CGRectMake (10, nextYVal, 280.0f, labelSize.height);
diningcell.typeLabel.frame = frame;
diningcell.typeLabel.lineBreakMode = NSLineBreakByWordWrapping;
diningcell.typeLabel.numberOfLines = 0;
diningcell.typeLabel.text = descrText;
nextYVal += diningcell.typeLabel.frame.origin.y + diningcell.typeLabel.frame.size.height + 10.0f;
diningcell.ussite= [object UrbanSpoon];
diningcell.website= [object Website];
diningcell.dirsite= [object Maps];
NSMutableArray* buttons = [[NSMutableArray alloc] init];
[buttons removeAllObjects];
if ([[object Website] isEqualToString:@""]){
[diningcell.websiteButton setHidden:TRUE];
}
else
{
[diningcell.websiteButton setHidden:FALSE];
[buttons addObject:diningcell.websiteButton];
}
if ([[object UrbanSpoon] isEqualToString:@""]){
[diningcell.usButton setHidden:TRUE];
}
else
{
[diningcell.usButton setHidden:FALSE];
[buttons addObject:diningcell.usButton];
}
if ([[object Maps] isEqualToString:@""]){
[diningcell.dirButton setHidden:TRUE];
}
else
{
[diningcell.dirButton setHidden:FALSE];
[buttons addObject:diningcell.dirButton];
}
if (buttons.count == 1){
[[buttons objectAtIndex:0] setCenter:CGPointMake(150.0f, 25.0f)];
}
else if (buttons.count == 2){
[[buttons objectAtIndex:0] setCenter:CGPointMake(75.0f, 25.0f)];
[[buttons objectAtIndex:1] setCenter:CGPointMake(225.0f, 25.0f)];
}
else if (buttons.count == 3){
[[buttons objectAtIndex:0] setCenter:CGPointMake(75.0f, 25.0f)];
[[buttons objectAtIndex:1] setCenter:CGPointMake(150.0f, 25.0f)];
[[buttons objectAtIndex:2] setCenter:CGPointMake(225.0f, 25.0f)];
}
return diningcell;
UPDATE レイアウトの問題を解決するためにカスタムビューを作成しました。ビューには 4 つのボタンが含まれており、layoutviews メソッドに配置されています。カスタム クラスのビューをプロトタイプ セルに追加すると、レイアウトが機能するように見えます。ただし、スクロールビューで方向を変更すると (つまり、下から上、上から下)、セルの一部がずれます。下の画像を参照してください。