Удалите белую линию рядом с изменением порядка управления на сгруппированных UITableViewCell - PullRequest
7 голосов
/ 17 мая 2009

Я создал пользовательский интерфейс для своей таблицы, который имеет более темный пользовательский интерфейс и пользовательский AccessoryView. Когда я переводю таблицу в режим редактирования, слева от элемента управления переупорядочением появляется белая линия, от которой я не могу избавиться.

tableView: accessoryTypeForRowWithIndexPath: , кажется, не подходит для избавления от него, поскольку я не использую стандартный UITableViewCellAccessoryType, поэтому я не уверен, что я могу сделать, чтобы получить не появляются на моих клетках.

White Line Example
(источник: secondgearsoftware.com )

Ответы [ 5 ]

12 голосов
/ 18 мая 2009

Происходит следующее: когда UITableViewCell показывает элемент управления переупорядочением, он также добавляет пустой массив UIView белого цвета шириной 1 пиксель в свой массив подпредставлений.

Прямо: это ошибка, которую Apple должна исправить.

Однако вы можете обойти его, находя этот раздражающий вид каждый раз, когда он появляется, и устанавливая его цвет фона на прозрачный. Быстрый совет : надоедливый белый вид всегда является последним в массиве подпредставлений UITableViewCell и всегда имеет ширину 1 пиксель. Мы будем использовать это, чтобы найти его.

Когда вы включаете редактирование для таблицы, сделайте все видимые раздражающие 1-пиксельные представления прозрачными. Таким образом, метод действия, который переключает режим редактирования таблицы, может выглядеть следующим образом:

- (IBAction)edit:(id)sender
{
    [tableView setEditing:!tableView.editing animated:YES];

    for (UITableViewCell *cell in [tableView visibleCells])
    {
        if (((UIView *)[cell.subviews lastObject]).frame.size.width == 1.0)
        {
            ((UIView *)[cell.subviews lastObject]).backgroundColor =
                [UIColor clearColor];
        }
    }
}

и продолжайте делать это для всех новых представлений, когда они становятся видимыми, реализуя это в вашем UITableViewDelegate:

- (void)tableView:(UITableView *)tableView
    willDisplayCell:(UITableViewCell *)cell]
    forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (((UIView *)[cell.subviews lastObject]).frame.size.width == 1.0)
    {
        ((UIView *)[cell.subviews lastObject]).backgroundColor =
             [UIColor clearColor];
    }
}

Этот хак для исправления проблемы довольно безобиден, и если Apple исправит ошибку в будущем (прекратит добавлять раздражающее 1-пиксельное представление), этот код должен спокойно перестать делать что-либо.

2 голосов
/ 07 сентября 2010

Попробовав решения от @ matt-gallagher и @bryce, я объединил их и создал переопределение setEditing.

- (void)setEditing:(BOOL)editing animated:(BOOL)animated {

    [super setEditing:editing animated:animated];

    for (UIControl *control in self.subviews) {
        if (control.frame.size.width == 1.0f) {
            control.backgroundColor = [UIColor clearColor];
        }                
    }
}
2 голосов
/ 18 мая 2009

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

Одна хитрость, которую я иногда использую для «отладки» подобных проблем, - это изменение цвета фона видов, которые являются вероятными подозреваемыми. Я мог бы установить цвет фона TableViewCell, а также его contentView на красный или синий и посмотреть, можете ли вы изменить цвет линии. Это, по крайней мере, даст вам представление о природе проблемы и, возможно, о том, как ее решить.

1 голос
/ 16 октября 2009

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

- (void)didTransitionToState:(UITableViewCellStateMask)state
{
//modified from comments here:
//http://www.erasetotheleft.com/post/overriding-the-drag-reorder-control-in-uitableviewcell/

 if(state == UITableViewCellStateEditingMask)
 {
  for (UIControl *control in self.subviews)
  {
   // Find the Reorder Control
   if ([control isMemberOfClass:NSClassFromString(@"UITableViewCellReorderControl")] && [control.subviews count] > 0)
   {
    // Do something with the control
   }
  }
 }
}
0 голосов
/ 01 августа 2012

У меня была похожая проблема, но в UITableViewStylePlain.

Мое решение благодаря @chrish и @ matt-gallagher:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    for (UIView *control in cell.subviews) 
    {
        if (control.frame.size.width == 1.0f) 
        {
            control.backgroundColor = [UIColor clearColor];
        }                
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...