У меня есть прототип ячейки с двумя ярлыками с надписью, за которым следует представление, содержащее до трех кнопок. Можно использовать кнопки 0, 1, 2 или 3 для каждой ячейки (на основе веб-xml-файла). Я хотел бы макет быть следующим (X представляет собой кнопку)iOS Auto Layout Динамическое размещение кнопок
3 Кнопки
| |
| X X X |
| |
2 Кнопка
| |
| X X |
| |
1 Кнопку
| |
| X |
| |
Моих ячейки таблицы кодовых наборов кадр каждой кнопки в зависимости от общего количества кнопок в ячейке. Однако кадр, похоже, работает до тех пор, пока ячейка не будет загружена во второй раз (например, прокрутите, чтобы ячейка была вне диапазона, а затем вернулась к ней). В прошлый раз это произошло из-за ограничений компоновки. Вопрос в том, как настроить ограничения в раскадровке, чтобы каждая кнопка могла находиться во многих местах? В настоящее время каждая кнопка прикреплена к верхней, нижней и передней кромке кнопки. Я знаю, что ограничение переднего края вызывает проблему, но не уверен, что использовать вместо этого, поскольку раскадровка вынуждает его. Или я могу что-то сделать в методе 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 Я создал настраиваемое представление, чтобы попытаться и более приходят вопросы компоновки. В представлении просто есть четыре кнопки и помещается на методе layoutviews. Я добавил представление о своем классе в свою прототипную ячейку, и макет, похоже, работает. Однако, когда я изменяю направления в scrollveiw (то есть вниз, затем вверх, вверх и вниз), некоторые из ячеек смещаются. См. Изображение ниже.
Я думал об использовании этого подхода, однако мне нужен общий вид, который позволит до трех кнопок из набора из пяти вариантов (вызов, загрузка, веб-сайт, urbanspoon и направления). Я не помню комбинированную математику, но пять выбирают три плюс пять выбирают 2 плюс ... приведут к большому количеству клеток-прототипов. – rmsanger
Используя этот подход, вы можете создать три прототипа с одной, двумя и тремя кнопками соответственно. Измените метки кнопок во время выполнения, но не меняйте место размещения. – kmorris
Я догадываюсь и меняю значок, однако мне придется дублировать ячейки прототипа во всех таблицах, которые я хотел бы использовать в пользовательском представлении. Я получил пользовательскую ячейку для работы, установив ширину каждой метки в XIB. До этого я программировал ширину ячеек/количество меток. Кажется, что это не работало, так как размер рамки метки не сообщал бы правильную высоту для заданной ширины. – rmsanger