Кнопка удаления 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иента для каждой ячейки?
- Какие новые команды документации доступны в Xcode 5?
- UIScrollView не прокручивается после обновления до iOS7 / xcode 5
- Xcode duplicate line
- Не удается найти исполняемый файл для CFBundle CertUIFramework.axbundle
- Приложение ссылается на непубличные селекторы в Payload / .app / : декодер
Одна из двух вещей может произойти. Когда появляется кнопка удаления, фоновый вид сдвигается, а затем обратно – или уменьшается его размер, а затем обратно. Я попытался испортить компонент ширины «self.bounds.size.width» для кадра gradleиента, но я до сих пор не вижу, как это может повлиять на вещи, потому что эта функция вызывается только один раз при инициализации ячейки.
ОРИГИНАЛЬНАЯ ПОЧТА:
Я создал приложение в Xcode4 под iOS6 SDK, но после загрузки вещей в новую среду (Xcode5 и iOS7 SDK) у меня возникла проблема. Обратите внимание, что я разрешил все ошибки сборки и предупреждения, которые возникли при выполнении перехода.
У меня есть табличное представление с некоторыми ячейками. После входа в режим редактирования, если щелкнуть красную кнопку переключения, чтобы инициировать режим удаления для ячейки – начинается анимация, и появляется кнопка «Удалить», но только кратковременно и затем внезапно скрывается.
Еще одна странная вещь, которую я должен отметить, заключается в том, что даже когда кнопка удаления закрыта – вы все равно можете щелкнуть там, где она должна быть, и удалить ячейку.
Я попытался вытащить как можно больше моего «настраиваемого кода», я удалил функции, которые я переопределил, и попытался вернуть вещи в исходное состояние, насколько это возможно, но безрезультатно.
В какой-то момент я увидел странное сообщение в журнале вывода: «попытка установить салфетки для удаления ячейки, когда у нас уже есть один …, который не кажется хорошим». По какой-то причине сообщение продолжает появляться, и я не могу вспомнить, что я делал в то время.
Любые мысли или рекомендации о том, что может быть причиной этого?
- Ошибка Xcode 5 CertUIFramework.axbundle
- Как добавить JPEG в каталог активов в Xcode?
- Как переименовать проект в Xcode 5?
- Интерфейс пользовательского интерфейса iOS 7
- Могут ли Xcode 6 и Xcode 5 сосуществовать на одном компьютере?
- iPhone пейзаж - только нет изображения запуска для iOS7 R4
- UIStatusBarStyle PreferredStatusBarStyle не работает на iOS 7
- Модульное тестирование XCode 5: запускает мое приложение
Это одна из бесчисленных ошибок в 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 }
}