UIScrollView поверх MKMapView

Я пытаюсь создать конкретный макет в приложении для iOS, где «фон» - это MKMapView, а наложение - это UIScrollView. Идея состоит в том, что есть два экрана, один с картой, а другой с дополнительной информацией. Пользователь может прокрутить вниз, чтобы увидеть эту общую информацию, и этот вид закрывает карту и имеет размытый фон для создания некоторой глубины.

Вот изображение, показывающее макет:

Макет изображения

Как видите, карта зафиксирована на своем месте. Он всегда будет позади содержимого, даже если вы прокрутите его. Я хочу, чтобы карта реагировала на жесты, но только при использовании непосредственно на карте. Когда пользователь «прокручивает» нижнюю панель, я хочу, чтобы содержимое прокручивалось вверх, открывая вторую страницу, которая затем закрывает карту.

Я не понимаю, что делать, чтобы этого добиться. Я попытался поместить карту на исходный UIView, а затем прикрыть его прокруткой, но из-за этого карта не реагирует на жесты. Я хочу, чтобы UIScrollView реагировал на жесты только тогда, когда он находится либо на нижней панели, либо на второй странице (каждая представляет собой отдельный вид). В противном случае я хочу, чтобы карта реагировала на жесты.

Надеюсь, мне удалось это хорошо объяснить, если нет, не стесняйтесь задавать вопросы. Я ценю любую помощь!


person Aleksander    schedule 31.12.2014    source источник


Ответы (1)


Похоже, вы добавляете полноэкранный UIScrollView поверх MKMapView, и scrollview улавливает все детали.

То, о чем вы спрашиваете, не обязательно является стандартным, поэтому существует несколько способов его реализации, и вам нужно решить, что лучше всего подходит для вашего варианта использования.

Вот что бы я сделал:

  1. Используйте ограничения для просмотра прокрутки, чтобы убедиться, что он покрывает только нижнюю область полосы.

  2. Убедитесь, что вы можете переключать константу ограничения, управляющую высотой прокрутки (подключите IBOutlet, если вы используете раскадровку).

  3. Добавьте как распознаватель жестов смахивания, так и распознаватель жестов касания, которые будут запускать toggleScrollViewFullScreen при распознавании. Убедитесь, что эти распознаватели могут быть распознаны только тогда, когда scrollView является нижней панелью.

  4. В верхнем углу должна отображаться кнопка X-out, пока прокрутка находится в полноэкранном режиме. Эта кнопка может вызывать toggleScrollViewFullScreen, чтобы закрыть представление обратно.

Пример метода toggleScrollViewFullScreen:

//Toggle size of scroll view
    - (void) toggleScrollViewFullScreen {
        CGFloat bottomBarHeight = 100;
        if (self.scrollViewHeightConstraint.constant > bottomBarHeight){
            self.scrollViewHeightConstraint.constant = bottomBarHeight
        }else {
            self.scrollViewHeightConstraint.constant = self.view.bounds.size.height;
        }
        //Animate constraint change:
        [UIView animateWithDuration:1 animations:^{
            [self.view setNeedsUpdateConstraints];
            [self.view setNeedsLayout];
        }];
    }
person BFar    schedule 31.12.2014
comment
Можно ли было бы позволить bottom-bar улавливать прикосновения, а затем отправлять их на ScrollView, который сам не улавливает никаких прикосновений, позволяя эффективно работать Map? - person Aleksander; 01.01.2015
comment
Если подумать, это действительно не очень важно. Однако как мне реализовать ваш метод с paging? Я бы хотел, чтобы пользователь выполнял обычную прокрутку, но блокировал страницу после ее освобождения, а не автоматически переходил на новую страницу при смахивании. - person Aleksander; 01.01.2015
comment
Вы можете переключить свойство scrollEnabled, чтобы получить такой эффект. - person BFar; 01.01.2015
comment
Я закончил тем, что просто перемещал представления, используя анимацию UIView вместо представления прокрутки. Это не совсем то, что я хочу, но это работает. Спасибо за вдохновение! - person Aleksander; 04.01.2015