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

UIButton не отвечает после заданного кадра в UIScrollview

У меня есть UIScrollView, какой контент разработан с помощью Interface Builder. У этого есть таблица с UIButton ниже. Если кнопка не была перемещена раньше, она работает (затрагиваетBegan и TouchUpInside вызывается), но если она была перемещена с помощью кнопки button.frame = в ответ на рост контента (таблица стала больше), она перестает отвечать на любые нажатия.

Я проверил, что перед ним нет скрытого представления, я даже использовал advViewToFront.

4b9b3361

Ответ 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];
}