UIButton не отвечает после заданного кадра в UIScrollview
У меня есть UIScrollView, какой контент разработан с помощью Interface Builder. У этого есть таблица с UIButton ниже. Если кнопка не была перемещена раньше, она работает (затрагиваетBegan и TouchUpInside вызывается), но если она была перемещена с помощью кнопки button.frame = в ответ на рост контента (таблица стала больше), она перестает отвечать на любые нажатия.
Я проверил, что перед ним нет скрытого представления, я даже использовал advViewToFront.
Ответы
Ответ 1
Проверьте, находится ли ваша конечная позиция UIButton внутри границ UITableView
и UIScrollView
.
Возможно, после того, как вы переместили его, UIBUtton
будет помещен за границу, а затем не будет реагировать на события касания.
Одна быстрая настройка, которая может заставить вас проверить, что нужно установить свойство clipToBounds
для ваших UITableView
и UIScrollView
в NO
, тогда весь контент, размещенный за пределами границ, даже не будет видимым.
Ответ 2
В проекте, над которым я работал недавно, у меня есть UITableView с UIButton в FooterView. Когда вы пытаетесь прокручивать предыдущую кнопку, так как это последний элемент в этом UITableView, кнопка будет прикреплена к нижней части представления.
Я столкнулся с той же проблемой, что и этот пост, когда содержимое моего UITableView привело к тому, что contentSize был меньше высоты UITableView. Мой UIButton был по существу вне границ исходного кадра прокручиваемого содержимого UITableView и, таким образом, не получал никаких событий.
Я хотел опубликовать свое решение, чтобы кому-то, кто получил это поведение, можно было помочь.
Мне пришлось переопределить методы pointInside:withEvent
и hitTest:withEvent
в моем настраиваемом классе UITableView:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
BOOL pointInside = [super pointInside:point withEvent:event];
if (!pointInside) {
CGRect buttonFrame = [self convertRect:self.myButton.frame fromView:self];
if (CGRectContainsPoint(buttonFrame, point)) {
return YES;
}
}
return pointInside;
}
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (!self.clipsToBounds && !self.hidden && self.alpha > 0) {
for (UIView *subview in self.subviews.reverseObjectEnumerator) {
CGPoint subPoint = [subview convertPoint:point fromView:self];
UIView *result = [subview hitTest:subPoint withEvent:event];
if (result != nil) {
return result;
}
}
}
// No other subviews have triggered this 'touch' check self.myButton
CGPoint subPoint = [self.myButton convertPoint:point fromView:self];
UIView *result = [self.myButton hitTest:subPoint withEvent:event];
if (result != nil) {
return result;
}
// Pass the 'touch' on if no subviews trigger the 'touch'
return [super hitTest:point withEvent:event];
}