swift2 如何在导航栏下扩展视图后校正视图的中心

xtupzzrd  于 2022-11-06  发布在  Swift
关注(0)|答案(1)|浏览(167)

在这个视图控制器中,我有一个导航栏、一个mkmapview和一个集合视图。我有以下代码:

import UIKit
import MapKit

class PhotoAlbumViewController: UIViewController {
    var annotation: VTAnnotation!
    var span: MKCoordinateSpan!

    @IBOutlet weak var mapView: MKMapView!
    @IBOutlet weak var collectionView: UICollectionView!

    override func viewDidLoad() {
        navigationController?.navigationBarHidden = false
        mapView.clipsToBounds = false
        mapView.addAnnotation(annotation)
        mapView.userInteractionEnabled = false
        let region = MKCoordinateRegion(center: annotation.coordinate, span: span)
        mapView.setRegion(region, animated: false)

    }
}

如果我的MKMapView被设置为位于Storyboard中的导航栏和收藏视图之间,那么大头针将根据需要居中。但是我不能显示导航栏的半透明性。

如果我的MKMapView被设置为位于导航栏下方,我可以显示导航栏的半透明性,但大头针现在偏离了中心。

如何使大头针显示在可见区域的中心,并显示导航栏的半透明性?
我觉得这应该是在文档。但我一直在寻找无处不在的运气,也许我不知道的关键字搜索。

ygya80vv

ygya80vv1#

我一直在努力解决这个问题,并设法通过使用setVisibleMapRect(_:edgePadding:animated:)方法向MKMapView添加一些顶部填充来解决它:

let span = MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01)
    let region = MKCoordinateRegion(center: annotation.coordinate, span: span)

    // 1. Set the Region
    mapView.setRegion(region, animated: false)

    // 2. Store the currently visible area
    let currentMapRect = mapView.visibleMapRect

    // 3. Store the sum of the navigation bar height and the top safe area inset
    var topPadding: CGFloat = 0
    if let safeAreaTopInset = UIApplication.shared.keyWindow?.safeAreaInsets.top,
        let navigationBarHeight = navigationController?.navigationBar.frame.height {
        topPadding = safeAreaTopInset + navigationBarHeight
    }

    // 4. Add the top padding to the map's visible area
    let padding = UIEdgeInsets(top: topPadding, left: 0.0, bottom: 0.0, right: 0.0)
    mapView.setVisibleMapRect(currentMapRect, edgePadding: padding, animated: true)

    mapView.addAnnotation(annotation)

相关问题