2013-08-21 2 views
0

У меня есть прототип ячейки с двумя ярлыками с надписью, за которым следует представление, содержащее до трех кнопок. Можно использовать кнопки 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 (то есть вниз, затем вверх, вверх и вниз), некоторые из ячеек смещаются. См. Изображение ниже.

Image

ответ

0

Я хотел бы использовать различные прототипы для трех типов клеток и установить выравнивание в раскадровке. У вас будет очень мало кода. Просто удалите ячейку соответствующего типа в cellForRowAtIndexPath: и настройте ее - нет необходимости напрямую манипулировать кадрами.

+0

Я думал об использовании этого подхода, однако мне нужен общий вид, который позволит до трех кнопок из набора из пяти вариантов (вызов, загрузка, веб-сайт, urbanspoon и направления). Я не помню комбинированную математику, но пять выбирают три плюс пять выбирают 2 плюс ... приведут к большому количеству клеток-прототипов. – rmsanger

+0

Используя этот подход, вы можете создать три прототипа с одной, двумя и тремя кнопками соответственно. Измените метки кнопок во время выполнения, но не меняйте место размещения. – kmorris

+0

Я догадываюсь и меняю значок, однако мне придется дублировать ячейки прототипа во всех таблицах, которые я хотел бы использовать в пользовательском представлении. Я получил пользовательскую ячейку для работы, установив ширину каждой метки в XIB. До этого я программировал ширину ячеек/количество меток. Кажется, что это не работало, так как размер рамки метки не сообщал бы правильную высоту для заданной ширины. – rmsanger