Как отправлять сенсорные события в супервизор в iOS?

Я делаю приложение для iPad. Как отправить сенсорные события в его супервизор?

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

Я хочу, чтобы это прозрачное представление игнорировало его события.

Можно ли это сделать?


person Shankar BS    schedule 10.07.2013    source источник


Ответы (2)


Задайте для свойства userInteractionEnabled представления значение NO. Это позволяет всем прикосновениям проникать в вид позади него.

Вы можете установить его в конструкторе интерфейсов/раскадровках в инспекторе атрибутов или в коде:

yourView.userInteractionEnabled = NO;

Для случаев, когда у вас есть прозрачное представление с кнопкой:

Создайте подкласс этого представления и переопределите метод pointInside. Как я это делаю, я передаю рамку кнопки подклассу в качестве свойства для проверки в методе pointInside:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
    BOOL pointInside = NO;
    // Check if the touch is in the button's frame
    if (CGRectContainsPoint(_buttonFrame, point)) pointInside = YES;

    return pointInside;
}

Надеюсь, поможет!

person Thermometer    schedule 10.07.2013
comment
Нет, не работает, кнопка не может быть нажата, потому что прозрачный вид содержит кнопку - person Shankar BS; 11.07.2013
comment
Ах, я неправильно понял ваш случай. Итак, у вас есть прозрачный вид с кнопкой, на которую вы хотите нажимать, но в прозрачных частях прикосновение должно проходить? Я обновил свой ответ тем, как я это делаю. - person Thermometer; 11.07.2013
comment
Я сделал то же, что и вы сказали, это не работает, просто посмотрите код ниже, он не работает - person Shankar BS; 11.07.2013
comment
посмотрите код один раз, я делаю правильно или нет, я могу нажать только кнопку в прозрачном представлении, но не кнопку основных представлений - person Shankar BS; 11.07.2013
comment
см. ответ, опубликованный мной, скажите, есть ли что-то неправильное в этом коде - person Shankar BS; 11.07.2013
comment
Этот ответ мне очень помог: установите для свойства userInteractionEnabled представления значение NO. Это позволяет всем прикосновениям проникать в вид позади него. - person Adam Studenic; 26.01.2016
comment
Поскольку CGRectContainsPoint() возвращает BOOL, не проще ли написать return CGRectContainsPoint(_buttonFrame, point) в качестве тела метода? - person bodacious; 12.04.2016
comment
Спасибо за это быстрое решение - person Vyacheslav; 04.11.2016

Решение, получившее наибольшее количество голосов, не работало для меня полностью, на самом деле оно передавало касания к некоторым частям пользовательского интерфейса, но оно мешало моему tableView, перехватывающему события касания, что, наконец, сделало, это переопределить hitTest в представление Я хочу игнорировать прикосновения (это будет ваш прозрачный вид) и позволить подвидам этого представления обрабатывать их (это будет ваша кнопка)

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    UIView *view = [super hitTest:point withEvent:event];
    if (view == self) {
        return nil; //avoid delivering touch events to the container view (self)
    }
    else{
        return view; //the subviews will still receive touch events
    }
}
person PakitoV    schedule 12.02.2018