Как отключить сообщение «выделить подпредставления» для UIView / UIViewController в iOS SDK? - PullRequest
11 голосов
/ 21 июня 2011

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

Редактировать Под «подвидом» я подразумеваю любой UIView подкласс, а не только UITableViewCell с.

Возможно, эта гипотетическая ситуация лучше сформулирует то, что я ищу : у меня есть один UITableViewCell .Назовите это c .Затем я добавляю один UIView (назовите его v ) в качестве подпредставления c .Когда я нажимаю c , я хочу, чтобы c стал выделенным (стандартный синий фон с белым цветом шрифта), но я не хочу v , чтобы выделиться.Как мне это сделать?

Ответы [ 12 ]

6 голосов
/ 21 марта 2013

У меня есть класс, который наследуется от UITableViewCell, поэтому я исправил его, переопределяя setSelected:animated следующим образом:

   - (void)setSelected:(BOOL)selected animated:(BOOL)animated
   {
       [super setSelected:selected animated:animated]; 
       //Reset highlighted status to all the childs that i care for.
       [self.someChild setHighlighted:NO];
       [self.someOtherChild setHighlighted:NO];
   }
6 голосов
/ 13 июля 2011

Прежде всего, UITableView перечисляет все подпредставления и отправляет им сообщения о выделении.

Таким образом, даже если вы добавите UILabel в ваше представление, независимо от его глубины, оно пересекает все представления (используя свойство subviews).

Одно решение можетbe (то есть IOS4 +), переопределяющее свойство subviews и функция мошенничества с чит-таблицей, у нас нет никаких подпредставлений.Для этого нам нужно определить вызывающего, и, если это метод подсветки таблицы, мы вообще не должны возвращать подпредставления.

Мы можем создать простой UIView подкласс и переопределить подпредставления , как показано ниже.

- (NSArray *)subviews{
    NSString* backtrace = [NSString stringWithFormat: @"%@",[NSThread callStackSymbols]];
    if ([backtrace rangeOfString:@"_updateHighlightColorsForView"].location!=NSNotFound)
        return [super subviews];   

    return [[NSArray new] autorelease];
}
  • callStackSymbols доступен после IOS4 +
  • _updateHighlightColorsForView - метод UITableView, отвечающий за выделение всех дочерних элементов
3 голосов
/ 14 августа 2011

Я решил эту проблему, переопределив -(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated следующим образом (работает, только если подпредставление является подклассом UIControl):

-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated {

    BOOL subviewWasEnabled = mySubview.enabled; //check if the view is enabled
    mySubview.enabled = NO; //disable it anyways

    [super setHighlighted:highlighted animated:animated];

    mySubview.enabled = subviewWasEnabled; //enable it again (if it was enabled)
}
3 голосов
/ 21 июня 2011

Используйте UITableViewCellSelectionStyleNone для ячеек таблицы.

См. документацию Apple API .

1 голос
/ 24 мая 2013

Я не хотел выделять ни одно из подпредставлений. Мое решение состояло в том, чтобы установить selectionstyle к UITableViewCellSelectionStyleNone и подражать поведению выбора по умолчанию следующим образом (переопределение setSelected на пользовательском подклассе UITableViewCell):

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

    int backgroundViewTag = 888;
    UIView *backgroundView = [self viewWithTag:backgroundViewTag];

    if (selected) {
        if (!backgroundView) {
            backgroundView = [[[UIView alloc] initWithFrame:self.bounds] autorelease];
            backgroundView.tag = backgroundViewTag;
            backgroundView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
            backgroundView.backgroundColor = [UIColor blueColor];
            backgroundView.alpha = 0.0;
            [self insertSubview:backgroundView atIndex:0];
        }

        if (animated) {
            [UIView animateWithDuration:0.5 animations:^{
                backgroundView.alpha = 1.0;
            }];
        } else {
            backgroundView.alpha = 1.0;
        }
    } else if (backgroundView) {
        if (animated) {
            [UIView animateWithDuration:0.5 animations:^{
                backgroundView.alpha = 0.0;
            } completion:^(BOOL finished) {
            }];
        } else {
            backgroundView.alpha = 0.0;
        }
    }
    [super setSelected:selected animated:animated];
}
1 голос
/ 31 октября 2011

Переопределите метод -(void)setHighlighted:(BOOL)highlight; в вашем подклассе UIControl, чтобы он ничего не делал. В случае UIButton подкласса вы можете сделать:

- (void)setHighlighted:(BOOL)highlighted {
    return;
}
1 голос
/ 08 июля 2011

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

Поскольку подсветка уважает изображения, которые яв итоге UIImageView заполнил весь кадр моего UIView и присвоил ему пустое изображение и нарисовал остальную часть вида выше UIImageView.Ваш UIView будет по-прежнему выделен, но вы не сможете его увидеть, потому что сверху будет пустое изображение!

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

0 голосов
/ 29 октября 2015

Просто поместите ваши взгляды в UIButton , и они не обновляются при выделении. Вы не можете сделать это с XIB раскадровки только на время выполнения .

UIButton *button = [[UIButton alloc] initWithFrame:0, 0, cellWidth, cellHeight];
[button addSubview:anyView]; // This view don't change his background color
[cell addSubview:button];
0 голосов
/ 13 июля 2011

Так, может быть, что-то вроде этого:

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

m_colors = [[NSMutableArray alloc] init];

for (UIView *view in [cell.contentView subviews]) {
    [m_colors addObject:view.backgroundColor];
}

return indexPath;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

for (int x = 0; x < [m_colors count]; ++x) {
    [[[cell.contentView subviews] objectAtIndex:x] setBackgroundColor:[m_colors objectAtIndex:x]];
}

[m_colors release];
m_colors = nil;
}
0 голосов
/ 13 июля 2011

Может быть, если вы создадите подкласс для своего подпредставления и переопределите метод setHighlighted, чтобы ничего не делать, или переопределите подсвеченный метод, чтобы он всегда возвращал NO.

Но у UIView нет выделенного состояния, какие дочерние элементы UIView вы добавляетев твою камеру?

...