Подтвердить что ты не робот

UIButton внутри UIView не отвечает на события касания

Я установил UIButton внутри пользовательского UIView, и кнопка не получает никаких событий касания (она не попадает в выделенное состояние, поэтому моя проблема не о невозможности подключения вверх прикосновение внутри обработчика). Я попробовал как поместить его в XIB в Interface Builder, так и попробовал программно добавить UIButton в UIView отдельно, оба закончились без везения. Все мои представления находятся внутри UIScrollView, поэтому я сначала, хотя UIScrollView может блокировать их, поэтому я также добавил кнопку программно точно так же, как я добавляю свое пользовательское представление в UIScrollView, и кнопка работала, исключая возможность UIScrollView быть причиной. Мой вид hiearchy выглядит следующим образом:

ss

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

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        UIView *sub = [[[NSBundle mainBundle] loadNibNamed:@"ProfileView" owner:self options:nil] objectAtIndex:0];
        [self addSubview:sub];
        [sub setUserInteractionEnabled:YES];
        [self setUserInteractionEnabled:YES];
        CALayer *layer = sub.layer;
        layer.masksToBounds = YES;
        layer.borderWidth = 5.0;
        layer.borderColor = [UIColor whiteColor].CGColor;
        layer.cornerRadius = 30.0;
        /*layer.shadowOffset = CGSizeZero;
        layer.shadowRadius = 20.0;
        layer.shadowColor = [[UIColor blackColor] CGColor];
        layer.shadowOpacity = 0.8;
        */
    }
    return self;
}

Я пробовал все комбинации setUserInteractionsEnabled, и мне не повезло. (Да, также установите их для проверки в Interface Builder тоже). Я также прочитал в другом вопросе с аналогичной проблемой, что я должен попробовать переопределить "canBecomeFirstResponder", чтобы вернуть "ДА", и я тоже это сделал. Но проблема остается, я не могу нажать кнопку. Я не дал никаких специальных свойств, настроек кнопки, это просто обычный. Мои другие объекты в представлении (надписи ниже, просмотр изображения за кнопкой и т.д.) Работают без проблем. Что может быть возможно здесь неправильно?

Спасибо,

Can.

ОБНОВЛЕНИЕ: Вот быстрое воспроизведение проблемы: https://dl.dropbox.com/u/79632924/Test.zip Попробуйте запустить и нажмите кнопку.

4b9b3361

Ответ 1

Взглянув на тестовый проект, я считаю, что ваша проблема в том, как вы создаете TestView, вы не указываете для него фрейм, поэтому в основном родительский вид имеет размер 0, а подвыводы, которые вы видите из XIB, выходящие из родительского просматривать и, следовательно, не получать ничего в цепочке ответчиков.

Вы должны указать кадр при создании TestView или настроить кадр после загрузки XIB файла.

Ответ 2

У меня тоже была эта проблема. Причиной для меня было то, что кадр надстройки UIButton был высотой 0, поэтому я считаю, что даже при том, что происходит прикосновение, оно не передавалось на кнопку.

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

Коренной причиной этой проблемы на моей стороне была ошибочная реализация макета (я забыл установить ограничение высоты для контроля над кнопкой).

Ответ 3

Я нашел решение. Я инициализировал свое пользовательское представление как:

MyView *view = [[MyView alloc] init];

Я инициализировал его вместо фрейма моего размера представления и начал отвечать на события:

CGRect rect = CGRectMake(0,0,width,height);
MyView *view = [[MyView alloc] initWithFrame:rect];

Ответ 4

Решение раскадровки

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

Добавьте ограничение между суперпредставлением (содержащим кнопку) и кнопкой UIB с ограничением равных высот.

В моем случае я выбрал встраивание UIButton в UIView без вставки в раскадровку. Добавление дополнительного ограничения высоты между UIButton и суперпредставлением позволило UIButton реагировать на прикосновения.

Вы можете подтвердить проблему, запустив View Debugger и визуально подтвердить, что суперпредставление UIButton невозможно выбрать.

(Xcode 11, * - также должен работать в более ранних версиях)