Как получить доступ к подпредставлению uiview частично вне его родительского uiview? - PullRequest
3 голосов
/ 02 октября 2011

У меня есть следующая архитектура UIVIew (x, y, ширина, высота):

- MainWindow (0,0,768,1024)
    - MainView (0,0,768,80) 
        - containerview (500,40,120,80)
            - subview (500,40,120,80) 
                -some buttons

Моя проблема в том, что нижняя часть подпредставления лежит за пределами MainView. Кнопки в нижней части 1005 * подпредставления не реагируют. Те, что наверху, отзывчивы, потому что их позиция тоже внутри Mainview.

Так что, когда я пытаюсь нажать на кнопки внизу подпредставления, я фактически нажимаю на MainWindow! Положение нижних кнопок подпредставления не внутри MainView

Есть ли способ сделать все мое подпредставление доступным, даже если половина его находится за пределами MainView?

Я знаю, что вместо этого я могу создать подпредставление непосредственно в MainWindow, но я не хочу переделывать свой код.

Обновление Вот как выглядит мой дизайн: A = MainWindow, B = MainView, C = вид контейнера, D = подпредставление, X = где я хочу нажать

+----------------------------+
|A                           |
|+-------------------------+ |
||B                        | |
||            +----------+ | |
|+------------|C&D       |-+ |
|             |X         |   |
|             +----------+   |
+----------------------------+

Спасибо

Ответы [ 3 ]

13 голосов
/ 02 октября 2011

Вам необходимо реализовать hitTest:(CGPoint)point withEvent:(UIEvent *)event в вашем MainView.

См. Документацию

Точки, находящиеся за пределами границ получателя, никогда не указываются как хиты, даже если они действительно лежат в пределах одного из подпредставлений получателя. Подвиды могут расширяться визуально за пределы их родителей, если Свойство родительского представления clipsToBounds имеет значение NO. Однако ударил тестирование всегда игнорирует точки за пределами родительского представления.

Адрес комментария:

Вы должны создать подкласс UIView. Затем установите класс MainView в кончике для вашего подкласса UIView.

Здесь обсуждается какой-то хит-тест , но я не смог найти четкого объяснения, как он работает.

Попробуйте этот вопрос StackOverflow

Я не тестировал его, но следующий код может сделать то, что вам нужно:

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    for(UIView *subview in self.subviews)
    {
        UIView *view = [subview hitTest:[self convertPoint:point toView:subview] withEvent:event];
        if(view) return view;
    }
    return [super hitTest:point withEvent:event];
}
0 голосов
/ 10 октября 2011

Я просто решил это сам. Как и вы, мое представление «B» запустило мое представление «C», и части «C» за пределами «B» были недоступны.

Мое решение было немного другим, потому что в моем случае «C» был полностью вне, но привязан к «B» (и был открыт «B»).

В моем случае я просто прикрепил 'C' к 'A' и использовал обратные вызовы @property для связи изменений в 'C' с 'B' (через 'A').

В вашем случае, другим решением было бы просто расширить кадр «B», чтобы охватить «C» - вы можете расширить его, когда «C» больше не будет виден. Сделайте фон «В» четким.

0 голосов
/ 02 октября 2011

Я не уверен на 100%, что понимаю, что вы пытаетесь сделать, но если подпредставление видно, но не внутри MainView, то единственный способ получить действия из подпредставления в MainView - это получить их в подпредставлении и передатьих на MainView.

Если это не ответ, мне нужно больше информации о том, что вы пытаетесь достичь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...