Изменение позиции пользовательского UIButton в пользовательском UITableViewCell - PullRequest
2 голосов
/ 02 декабря 2011

Мне нужно динамически изменить положение UIButton.Я делаю это в cellForRowAtIndexPath:.Я изменяю кадр кнопки в этом методе.Изменение не отображается при первоначальном отображении таблицы.Но когда я прокручиваю клетки и возвращаюсь к ним, они отображаются.Точно так же, когда я впервые прокручиваю до ячеек, не видимых изначально, никаких изменений не происходит.Изменение происходит, когда я прокручиваю его во второй раз.

Я пробовал setNeedsDisplay: как для пользовательской кнопки, так и для представления таблицы.Я сделал это даже в willDisplayCell:forRowAtIndexPath:.Как мне решить это?

РЕДАКТИРОВАТЬ: я забыл упомянуть, что я загружаю UITableViewCell из файла пера.Вот код для изменения размера фрейма.

label1.text  = //text from some source
label1.text = [label1.text stringByAppendingString:@"  |"];
[label1 sizeToFit];
CGRect frameAfterResize=label1.frame;
float x=frameAfterResize.origin.x+frameAfterResize.size.width;
button.frame=CGRectMake(x+2, button.frame.origin.y, button.frame.size.width,button.frame.size.height);

Ответы [ 7 ]

6 голосов
/ 07 декабря 2011

Создайте свой собственный подкласс UITableViewCell. Создайте и добавьте кнопку в contentView ячейки в вашем методе init или создайте и добавьте ее лениво через свойство accessor. Переопределите layoutSubviews и поставьте кнопку по желанию.

Примерно так:

@implementation MyCustomCell

- (void) init
{
    self = [super initWithStyle: UITableViewCellStyleDefault reuseIdentifier: nil];
    if ( self != nil )  
    {
         _myButton = [[UIButton buttonWithType: UIButtonTypeRoundedRect] retain];
         [self.contentView addSubview: _myButton];
    }

    return self;
}

- (void) layoutSubviews
{
    [super layoutSubviews];

    // dynamic layout logic:
    if ( ... )
    {

         _myButton.frame = CGRectMake( 10, 10, 100, 30 );
    }
    else 
   {
         _myButton.frame = CGRectMake( 20, 10, 50, 30 );

   }
}

В качестве альтернативы, вы можете попытаться сделать расположение ячеек в - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath

3 голосов
/ 23 июня 2014

У меня была та же проблема, в которой я загружал ячейку из пера, но ни одно из вышеперечисленных решений полностью не помогло мне.Они решили проблему по нескольким сценариям, но не по всем.

Вот решение, которое работало для всех сценариев.

@implementation MyChannelCell
-(void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    //Calling from here fixed issue for first time cell load
    [self alignCellViews];
}
-(void)layoutSubviews
{
    [super layoutSubviews];
    //Calling from here fixed issue for coming back to the tableview from other ViewConroller
    [self alignCellViews];

}
/**
Method to change the layout and positions of sub-views
*/
-(void)alignCellViews
{
    //Code to position sub-views
    //self.lblSubscribers is an outlet from nib of type UILabel
    [self.lblSubscribers setFrame:CGRectMake(140, 26, 36, 26)];

    [self setNeedsDisplay];
}

@end
1 голос
/ 12 декабря 2011
  1. Создайте свой собственный подкласс UITableViewCell
  2. Подключите все розетки (также кнопки) из вашей xib к этому классу
  3. Создайте пользовательский метод в этом подклассе UITableViewCell, например - см. Нижене могу отформатировать его там.
  4. в cellForRowAtIndexPath: используйте этот метод для изменения фрейма и перерисовки ячейки

    [cell setNewFrame: ....];

у меня работает нормально

 -(void)setNewFrame:(CGRect)newFrame
    {
        myButton.frame=newFrame;
        [self setNeedsDisplay];
    }

, если вы хотите настроить кнопку на текст

-(void)setNewCaption:(NSString)newCaption
{
  label1.text  = newCaption
  label1.text = [label1.text stringByAppendingString:@"  |"];
  // calculate new frame
  myButton.frame=//new frame
  [self setNeedsDiplay];
}
1 голос
/ 02 декабря 2011

Вы пытались перезагрузить таблицу после изменения фрейма ячейки, используя

[self.tableView reloadData]

Я думаю, это должно решить вашу проблему.

0 голосов
/ 07 декабря 2011

При рисовании UITableViews ячейки таблицы используются повторно, поэтому существует только один экземпляр UITableViewCell, идентифицируемый строкой, переданной в dequeueReusableCellWithIdentifier:.

Если вы обновите ячейку в методе cellForRowAtIndexPath: это будетне даст ожидаемого эффекта - каждый раз вы будете ссылаться на одну и ту же ячейку (поэтому каждая ячейка будет иметь кнопку в одной и той же позиции).Следовательно, проблема, с которой вы сталкиваетесь, заключается в том, что при прокрутке положение кнопки меняется.

Самая простая вещь, позволяющая решить вашу проблему, - это изменить код, чтобы прекратить повторное использование ячеек, каждый раз создавая новую ячейку в cellForRowAtIndexPath.Обновите код следующим образом:

// comment out this line
// cell = [tableView dequeueReusableCellWithIdentifier:identifier];

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:nibName];
cell = [nib objectAtIndex:0];

Обратите внимание, что повторное использование ячеек является предпочтительным из соображений эффективности (для экономии памяти и сокращения выделения памяти).

Идеальным решением является созданиепользовательский подкласс UITableViewCell и обновите положение UIButton в методе layoutSubviews.

0 голосов
/ 02 декабря 2011

Если он отображается не так, как требуется изначально, но отображается после прокрутки, то я предполагаю, что вы изменяете положение метки только тогда, когда ячейка снята с очереди, а не когда она первоначально загружена из пера.

Вы не указали эту часть вашего метода cellForRowAtIndexPath, поэтому я не могу дать более конкретный совет на данный момент, но либо приведенный выше код не выполняется, либо label1 равно нулю, когда новая ячейкаmade (т.е. когда метод dequeue возвращает nil и вы загружаете из nib).

0 голосов
/ 02 декабря 2011

Позвоните setNeedsDisplay с вашим UITableViewCell объектом.

[cell setNeedsDisplay];

в cellForRowAtIndexPath:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...