Изменение цвета UITableViewCellDeleteConfirmationControl (кнопка удаления) в UITableViewCell
В настоящее время я пытаюсь настроить кнопку delte в UITableViewCell.
Теперь у меня есть что-то вроде этого:
Теперь все, что мне нужно, это изменить цвет этой кнопки, я не хочу менять поведение или сделать его абсолютным обычаем. Я уверен, что это возможно, без создания собственных элементов управления для удаления строк в UITableView.
Этот мой код:
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIView *subview in self.subviews) {
if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
deleteButtonView.backgroundColor = [UIColor greenColor];
}
}
}
Как я могу это сделать?
Спасибо заранее!
Ответы
Ответ 1
Это решение:
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIView *subview in self.subviews) {
if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl"]) {
UIView *deleteButtonView = (UIView *)[subview.subviews objectAtIndex:0];
UIImageView *image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"Background"]];
[deleteButtonView addSubview:image];
}
}
}
Ответ 2
UITableViewCellDeleteConfirmationControl не является общедоступным классом, и вы не можете легко изменить его внешний вид.
Чтобы сделать это, я верю, что вам придется перебирать подзоны ячейки и изменять ее свойства:
for (UIView *subview in self.subviews) {
if ([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationControl") {
// Set the background using an image.
}
}
Конечно, вы должны с осторожностью относиться к подобным вещам, так как они довольно хрупкие. Вместо этого я предлагаю вам переделать.
Я предлагаю представить отчет об ошибке Apple, чтобы запросить возможность более легкого редактирования.
Ответ 3
В подклассе UITableViewCell:
- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
for(UIView *subview in view.subviews) {
if([NSStringFromClass([subview class]) isEqualToString:@"UITableViewCellDeleteConfirmationButton"]) return subview;
UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
if(recursiveResult) return recursiveResult;
}
return nil;
}
-(void)overrideConfirmationButtonColor
{
dispatch_async(dispatch_get_main_queue(), ^{
UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self];
if(confirmationButton) confirmationButton.backgroundColor = [UIColor orangeColor];
});
}
Затем в UITableViewDelegate:
-(void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
<#Your cell class#> *cell = (<#Your cell class#>*)[self.tableView cellForRowAtIndexPath:indexPath];
[cell overrideConfirmationButtonColor];
}
Это работает в iOS 7.1.2
Ответ 4
Здесь как:
активировать кнопку удаления при прокрутке
//убедитесь, что у вас есть следующие методы в uitableviewcontroller
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"You hit the delete button.");
}
установить специальную текстовую метку вместо удаления.
-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
return @"Your Label";
}
установить собственный цвет для кнопки часть 1 - предупреждение, это технически включает в себя выталкивание в частном яблочном API. Тем не менее, вам не запрещено изменять подзаголовок, используя общедоступный метод поиска, который является частью UIKIT.
Создайте класс uitableviewcell (см. также fooobar.com/questions/7745/...)
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIView *subview in self.subviews) {
//iterate through subviews until you find the right one...
for(UIView *subview2 in subview.subviews){
if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) {
//your color
((UIView*)[subview2.subviews firstObject]).backgroundColor=[UIColor blueColor];
}
}
}
}
Другое примечание: нет гарантии, что этот подход будет работать в будущих обновлениях. Также будьте осторожны, что упоминание или использование частного класса UITableViewCellDeleteConfirmationView
может привести к отказу AppStore.
установить пользовательский цвет для кнопки 2
обратно в ваш uitableviewcontroller
- (void)tableView:(UITableView *)tableView willBeginEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
[YourTableView reloadData];
}
(Альтернативный цвет не будет вызываться до следующего вызова layoutSubviews на tablecell, поэтому мы гарантируем, что это произойдет, перезагрузив все.)
Ответ 5
Силиевский пример отличный... но, через шесть месяцев, iOS 8 пришел, и он уже не работает должным образом.
Теперь вам нужно найти подзону под названием "_UITableViewCellActionButton
" и установить цвет фона.
Ниже приведена модифицированная версия силиевского кода, который я использовал в своем приложении.
В некоторых моих ячейках UITableView
я не хотел, чтобы пользователь мог прокручивать-удалять, но я действительно хотел что-то (значок замка), чтобы появиться, когда они пронеслись.
Чтобы сделать это, я добавил переменную bReadOnly
в свой класс UITableViewCell
@interface NoteTableViewCell : UITableViewCell
. . .
@property (nonatomic) bool bReadOnly;
-(void)overrideConfirmationButtonColor;
@end
и я добавил силиевский код в мой файл .m:
- (UIView*)recursivelyFindConfirmationButtonInView:(UIView*)view
{
for(UIView *subview in view.subviews) {
if([NSStringFromClass([subview class]) rangeOfString:@"UITableViewCellActionButton"].location != NSNotFound)
return subview;
UIView *recursiveResult = [self recursivelyFindConfirmationButtonInView:subview];
if(recursiveResult)
return recursiveResult;
}
return nil;
}
-(void)overrideConfirmationButtonColor
{
if (!bReadOnly)
return;
dispatch_async(dispatch_get_main_queue(), ^{
UIView *confirmationButton = [self recursivelyFindConfirmationButtonInView:self];
if(confirmationButton)
{
confirmationButton.backgroundColor = [UIColor lightGrayColor];
UIImageView* imgPadLock = [[UIImageView alloc] initWithFrame:confirmationButton.frame];
imgPadLock.image = [UIImage imageNamed:@"icnPadlockBlack.png"];
imgPadLock.contentMode = UIViewContentModeCenter; // Don't stretch the UIImage in our UIImageView
// Add this new UIImageView in the UIView which contains our Delete button
UIView* parent = [confirmationButton superview];
[parent addSubview:imgPadLock];
}
});
}
Кроме того, мне нужно было изменить код, который заполняет UITableView
, иначе появится метка "Удалить", а также значок замка:
-(NSString*)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
Note* note = [listOfNotes objectAtIndex:indexPath.row];
if ( /* Is the user is allowed to delete this cell..? */ )
return @"Delete";
return @" ";
}
Это все еще некрасиво и полагается на предположения, что это не все изменится, когда появится iOS 9.
Ответ 6
Ответ на совместимость с IOS7 (не создавая пользовательский класс, но расширяя UITableViewCell:
@implementation UITableViewCell (customdelete)
- (void)layoutSubviews
{
[super layoutSubviews];
for (UIView *subview in self.subviews) {
for(UIView *subview2 in subview.subviews){
if ([NSStringFromClass([subview2 class]) isEqualToString:@"UITableViewCellDeleteConfirmationView"]) {
((UIView*)[subview2.subviews firstObject]).backgroundColor=COLOR_RED;
//YOU FOUND THE VIEW, DO WHATEVER YOU WANT, I JUST RECOLOURED IT
}
}
}
}
@end