Развернуть заголовок заголовка UITableView для области отказов при вытягивании

Я реализовал MKMapView в области заголовка, и я бы хотел его полностью расширить до вершины, даже когда вы перетаскиваете таблицу в область отказов. Подобно Foursquare, см. пример:

Foursquare Example

Моя текущая реализация заголовка по умолчанию (область серого отражения при перетаскивании вниз)

Default Header

Как сделать отображение карты в заголовке адаптированным к доступному пространству заголовка сверху при перетаскивании таблицы?

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

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGRect frame = worldmap.frame;
    frame.size.height -= scrollView.contentOffset.y;
    worldmap.frame = frame;  
} 

... но он не совсем реагирует правильно и работает плохо. Как правильно установить новый размер кадра карты?

Ответ 1

Внедрите делегат scrollview для представления таблицы. Поскольку это подкласс scrollview, вы можете использовать делегаты scrollview. Внесите делегат scrollViewDidScroll и всякий раз, когда он прокручивается вниз, измените рамку headerview и убедитесь, что вывод всегда находится в центре экрана.

Включить UIScrollViewDelegate в .h файл и реализовать,

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
  //set the frame of MKMapView based on scrollView.contentOffset and make sure the pin is at center of the map view
}

Ответ 2

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

Edit: Я заметил, что булавка в примере Foursquare находится в центре карты. Это означает, что вы, вероятно, должны использовать UIScrollViewDelegate для использования метода didScroll и динамически изменять кадр карты во время прокрутки. Вы также должны центрировать карту в области контактов при прокрутке.

Ответ 3

Старый вопрос, но я реализовал это в проекте.

Заголовок TableView является MapView и в качестве дополнительного бонуса можно также перемещать и масштабировать карту.

https://github.com/danielbowden/DBParallaxMapTableView

Ответ 4

Я помещаю содержимое заголовка в другое представление, которое я ограничиваю с каждой стороны заголовка. Затем, используя IBOutlet для верхнего ограничения, я просто устанавливаю его в contentOffset.

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (_tableView.contentOffset.y < 0) {
        _mapTopConstraint.constant = _tableView.contentOffset.y;
    }
}