Кнопка удаления UITableViewCell закрывается
UPDATE:
Благодаря информации от "Evgeny S" я смог определить, что скрытая кнопка удаления - это фон ячейки. У меня была следующая функция, вызываемая в начале инициализации ячейки:
- (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. Тем не менее, мне интересно, как это можно решить, сохранив фон градиента для каждой ячейки?
Одна из двух вещей может произойти. Когда появляется кнопка удаления, фоновый вид сдвигается, а затем обратно - или уменьшается его размер, а затем обратно.
Я попытался испортить компонент ширины "self.bounds.size.width" для кадра градиента, но я до сих пор не вижу, как это может повлиять на вещи, потому что эта функция вызывается только один раз при инициализации ячейки.
ОРИГИНАЛЬНАЯ ПОЧТА:
Я создал приложение в Xcode4 под iOS6 SDK, но после загрузки вещей в новую среду (Xcode5 и iOS7 SDK) у меня возникла проблема. Обратите внимание, что я разрешил все ошибки сборки и предупреждения, которые возникли при выполнении перехода.
У меня есть табличное представление с некоторыми ячейками. После входа в режим редактирования, если щелкнуть красную кнопку переключения, чтобы инициировать режим удаления для ячейки - начинается анимация, и появляется кнопка "Удалить", но только кратковременно и затем внезапно скрывается.
Еще одна странная вещь, которую я должен отметить, это то, что даже когда кнопка удаления закрыта - вы все равно можете щелкнуть там, где она должна быть, и удалить ячейку.
Я попытался извлечь как можно больше моего "настраиваемого кода", я удалил функции, которые я переопределил, и попытался вернуть данные в исходное состояние, насколько это возможно, но безрезультатно.
В какой-то момент я увидел странное сообщение в журнале вывода:
"попытка установить салфетки, чтобы удалить ячейку, когда у нас уже есть..., которая не кажется хорошей". По какой-то причине сообщение продолжает появляться, и я не могу вспомнить, что я делал в то время.
Любые мысли или рекомендации о том, что может быть причиной этого?
http://www.youtube.com/watch?v=vCAGzSaOwp4
Ответы
Ответ 1
Это одна из бесчисленных ошибок в iOS 7.
По какой-то причине backgroundView перемещается iOS над кнопкой удаления.
Вы можете обойти это, подклассифицируя ваш 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];
}
}
В качестве побочного примечания: вы можете избежать необходимости в отдельном подуровне путем подкласса и реализации layerClass в вашем производном виде:
+ (Class)layerClass
{
return [CAGradientLayer class];
}
Ответ 2
Я исправил это, найдя вид кнопки удаления и доведя его до фронта. Я сделал это в layoutSubviews в подклассе 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];
}
}
}
Ответ 3
- (void)layoutSubviews
{
[super layoutSubviews];
[self sendSubviewToBack:self.contentView];
}
Ответ 4
Вы можете использовать colorWithPatternImage, но для меня было проще использовать self.layer.content.
например:
cell.layer.contents = (id)[UIImage imageNamed:@"singleRow.png"].CGImage;
Таким образом, изображение не растягивается, и оно не должно быть в точном размере.
Таким образом, кнопка удаления не закрывается фоновым изображением ячейки.
By the Way: эти пользовательские фон градиента, похоже, не совпадают с основными проявлениями iOS 7, вы думаете, что это может послужить основанием для не одобрения приложения?
Ответ 5
Я столкнулся с проблемой, когда мой UITableView находился в режиме редактирования, и после удаления 2-3 строк я получаю сообщение "попытка установить салфетки, чтобы удалить ячейку, когда у нас уже есть одна..., которая не кажется хорошей" регистрируется, а затем взаимодействует с пользователем во всех ячейках, за исключением того, что одна ячейка отключена.
Я решил эту проблему
[myTableView setEditing:NO animated:NO];
[myTableView setEditing:YES animated:NO];
после каждого удаления.
Этот обходной путь работал в моем случае.
Ответ 6
Вы можете избежать этой проблемы, установив фон, который вы хотите для uitableview, и установите cell.backgroudColor = [UIColor clearColor];
и cell.contentView.backgroundColor = [UIColor clearColor];
Ответ 7
У меня возникла аналогичная проблема и у меня есть работа над тем, что ставит кнопку "Удалить" поверх содержимого моей ячейки, но анимация немного уродлива. Когда это делается, кнопка видна и делает правильную вещь.
Создайте собственный подкласс UITableViewCell и добавьте следующий код:
-(void)didTransitionToState:(UITableViewCellStateMask)state
{
if (state & UITableViewCellStateShowingDeleteConfirmationMask ) {
[self sendSubviewToBack:self.contentView];
}
[super didTransitionToState:state];
}
Было бы полезно усовершенствовать этот подход или другие указатели.
Ответ 8
Очиститель, общее решение
Предполагая, что приложение только для iOS7, с техникой, аналогичной методике, описанной выше, я считаю, что подход здесь: fooobar.com/questions/352708/... будет более чистым.
В этом подходе вам не нужно подклассифицировать фоновый просмотр, который может отличаться для разных ячеек.
Поместите код в ответ, который я связал выше, в корне вашей иерархии ячеек таблицы и всех ваших ячеек таблицы (которые наследуются от него), получите исправление, когда они используют backgroundView или selectedBackgroundView.
Ответ 9
Я по-прежнему вижу эту проблему после обновления до 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";
}
Это работает для меня, но главный недостаток заключается в том, что область подтверждения более широкая, чем вы думаете, что это возможно для непреднамеренного удаления.
Ответ 10
Если вы запустили проект в SDK iOS 6 и используете раскадровки, это может быть проблемой с ограничениями. Попробуйте удалить все ограничения ячеек и вернуться к предложению. Это может решить проблемы с кнопкой удаления. У меня были такие проблемы в двух разных проектах, и они были описаны описанным способом.
Ответ 11
И еще одно обходное решение:
- (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);
}
}
Ответ 12
вот лучший способ просто убедиться, что вы подклассифицируете 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
}
}