Кнопка удаления UITableViewCell закрывается

ОБНОВИТЬ:

Благодаря информации от «Evgeny S», я смог определить, что скрытая кнопка удаления – это фон ячейки. У меня была следующая функция, вызываемая в начале ячейки init:

- (void) setupGradientsWithHeight:(int) the_height { CAGradientLayer* gradient = [CAGradientLayer layer]; gradient.frame = CGRectMake(self.bounds.origin.x, self.bounds.origin.y, self.bounds.size.width, the_height); gradient.colors = [NSArray arrayWithObjects: (id)[UIColor colorWithRed:218.0f/255.0f green:218.0f/255.0f blue:220.0f/255.0f alpha:1.0].CGColor, (id)[UIColor colorWithRed:180.0f/255.0f green:180.0f/255.0f blue:184.0f/255.0f alpha:1.0].CGColor,nil]; UIView* bgview = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)]; [bgview.layer addSublayer:gradient]; [self setBackgroundView:bgview]; } 

Проблема решается НЕ добавляя backgroundview. Тем не менее, мне интересно, как это можно решить, сохраняя фон gradleиента для каждой ячейки?

Одна из двух вещей может произойти. Когда появляется кнопка удаления, фоновый вид сдвигается, а затем обратно – или уменьшается его размер, а затем обратно. Я попытался испортить компонент ширины «self.bounds.size.width» для кадра gradleиента, но я до сих пор не вижу, как это может повлиять на вещи, потому что эта функция вызывается только один раз при инициализации ячейки.

ОРИГИНАЛЬНАЯ ПОЧТА:

Я создал приложение в Xcode4 под iOS6 SDK, но после загрузки вещей в новую среду (Xcode5 и iOS7 SDK) у меня возникла проблема. Обратите внимание, что я разрешил все ошибки сборки и предупреждения, которые возникли при выполнении перехода.

У меня есть табличное представление с некоторыми ячейками. После входа в режим редактирования, если щелкнуть красную кнопку переключения, чтобы инициировать режим удаления для ячейки – начинается анимация, и появляется кнопка «Удалить», но только кратковременно и затем внезапно скрывается.

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

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

В какой-то момент я увидел странное сообщение в журнале вывода: «попытка установить салфетки для удаления ячейки, когда у нас уже есть один …, который не кажется хорошим». По какой-то причине сообщение продолжает появляться, и я не могу вспомнить, что я делал в то время.

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

Это одна из бесчисленных ошибок в iOS 7.

По какой-то причине backgroundView перемещается iOS над кнопкой удаления. Вы можете обойти это, подclassифицируя ваш backgroundView и реализуя функцию setFrame вашего производного вида следующим образом:

 - (void)setFrame:(CGRect)frame { if ([[[UIDevice currentDevice] systemVersion] compare:@"7.0" options:NSNumericSearch] != NSOrderedAscending) { // background view covers delete button on iOS 7 !?! [super setFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height)]; } else { [super setFrame:frame]; } } 

В качестве побочного примечания: вы можете избежать необходимости в отдельном подуровне путем подclassа и реализации layerClass в вашем производном виде:

 + (Class)layerClass { return [CAGradientLayer class]; } 

Я исправил это, найдя вид кнопки удаления и доведя его до фронта. Я сделал это в layoutSubviews в подclassе UITableViewCell.

Вот небольшой код, который должен дать вам представление о том, как это сделать:

 - (void)layoutSubviews { [super layoutSubviews]; for (UIView *subview in self.subviews) { for (UIView *subview2 in subview.subviews) { if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) { // move delete confirmation view [subview bringSubviewToFront:subview2]; } } } 
 - (void)layoutSubviews { [super layoutSubviews]; [self sendSubviewToBack:self.contentView]; } 

Я столкнулся с проблемой, когда мой UITableView находился в режиме редактирования, и после удаления 2-3 строк я получаю сообщение «попытка установить салфетки для удаления ячейки, когда у нас уже есть один … который не кажется хорошим», и затем пользовательское взаимодействие во всех ячейках, кроме одной ячейки, отключается.

Я решил эту проблему

 [myTableView setEditing:NO animated:NO]; [myTableView setEditing:YES animated:NO]; 

после каждого удаления.

Этот обходной путь работал в моем случае.

Вы можете использовать colorWithPatternImage, но для меня было проще использовать self.layer.content. например :

 cell.layer.contents = (id)[UIImage imageNamed:@"singleRow.png"].CGImage; 

Таким образом, изображение не растягивается, и оно не должно быть в точном размере. Таким образом, кнопка удаления не закрывается фоновым изображением ячейки. По пути: эти пользовательские фон gradleиента, похоже, не совпадают с основными проявлениями iOS 7, как вы думаете, это может быть основанием для не одобрения приложения?

У меня возникла аналогичная проблема и у меня есть работа над тем, что ставит кнопку «Удалить» поверх содержимого моей ячейки, но анимация немного уродлива. Когда это делается, кнопка видна и делает правильную вещь.

Создайте собственный подclass UITableViewCell и добавьте следующий код:

 -(void)didTransitionToState:(UITableViewCellStateMask)state { if (state & UITableViewCellStateShowingDeleteConfirmationMask ) { [self sendSubviewToBack:self.contentView]; } [super didTransitionToState:state]; } 

Усовершенствования в отношении этого подхода или других указателей будут оценены.

Очиститель, общее решение

Предполагая, что приложение только для iOS7, с техникой, аналогичной той, что была написана выше, я считаю, что подход здесь: https://stackoverflow.com/a/19416870/535054 будет чище.

В этом подходе вам не нужно подclassифицировать фоновое изображение, которое может быть различным для разных ячеек.

Поместите код в ответ, который я связал выше, в корне вашей иерархии ячеек таблицы и всех ваших ячеек таблицы (которые наследуются от него), получите исправление всякий раз, когда они используют свойства backgroundView или selectedBackgroundView .

Я по-прежнему вижу эту проблему после обновления до XCode 5.0.1, но я использовал другое обходное решение, которое должно использовать логическое имя changeTitle установленное в NO в willBeginEditingRowAtIndexPath и установить значение YES в editingStyleForRowAtIndexPath если мы не находимся в режиме удаления строки ,

Затем я использую эту переменную для ввода названия кнопки с дополнительными пробелами в titleForDeleteConfirmationButtonForRowAtIndexPath .

 -(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath { if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0 && changeTitle) { return @" Delete"; } return @"Delete"; } 

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

Вы можете избежать проблемы, установив фон, который вы хотите для uitableview, и установите cell.backgroudColor = [UIColor clearColor]; и cell.contentView.backgroundColor = [UIColor clearColor];

Если вы запустили проект в SDK iOS 6 и используете раскадровки, это может быть проблемой с ограничениями. Попробуйте удалить все ограничения ячеек и вернуться к предложению. Это может решить проблемы с кнопкой удаления. У меня были такие проблемы в двух разных проектах, и они были описаны описанным образом.

И еще одно обходное решение:

 - (void) layoutSubviews { [super layoutSubviews]; if ([ [ [UIDevice currentDevice] systemVersion] compare: @"7.0" options: NSNumericSearch] != NSOrderedAscending) { if (iOS7 == YES) { self.backgroundView.frame = CGRectMake(0, self.backgroundView.frame.origin.y, self.backgroundView.frame.size.width, self.backgroundView.frame.size.height); } } 

вот лучший способ, просто убедитесь, что вы подclassифицируете UITableviewController для повышения производительности и добавьте этот код

 - (void)setEditing:(BOOL)editing animated:(BOOL)animated { [super setEditing:editing animated:animated]; CGRect frame = self.tableView.frame; if(editing){ [self.tableView setFrame:CGRectMake(0, frame.origin.y, frame.size.width, frame.size.height)]; //other codes to run if needed }else{ [self.tableView setFrame:frame]; //other codes to run if needed } 

}

  • Xcode duplicate line
  • как остановить создание xcode5.1 для 64-битных
  • Какие новые команды документации доступны в Xcode 5?
  • Interesting Posts

    Что такое инструмент «dumpsys» для Android ADB и каковы его преимущества?

    Функция std :: не может отличить перегруженные функции

    Не получать уведомления о тостах. Как устранить неполадки?

    Как иметь петлю в службе Windows без использования таймера

    Подключение к компьютерам в другой сети маршрутизатора

    «Удаленный сертификат недействителен в соответствии с процедурой проверки». Используя SMTP-сервер Gmail

    Как предотвратить перемещение дополнительного пространства дисплея с места для ноутбука в macOS?

    Проблема с отображением и результатами Google, во всех браузерах

    Почему Sass меняет формат моих цветов?

    Создание дерева выражений в Prolog

    Построение двух переменных в виде строк с использованием ggplot2 на одном графике

    Доступ к файлу внутри файла .jar

    Как разбирать вложенный объект JSON в Delphi XE2?

    Как я могу сообщить Moq о возврате задачи?

    Является ли это правильным способом использования Java 2D Graphics API?

    Давайте будем гением компьютера.