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
Попробуйте запустить и нажмите кнопку.
Ответы
Ответ 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, * - также должен работать в более ранних версиях)