2014-02-20 41 views
10

我希望能夠放大我的MKMapView以適應它的註釋。我設法使用iOS7的showAnnotations方法。但我也想從地圖視圖邊框添加一些填充或插入。這是因爲我有一個覆蓋地圖頂部的半透視圖,我不希望註釋成爲這個視圖的後面。我試過這個:iOS - MKMapView showAnnotations:animated:with padding?

[self.mapView showAnnotations:annotations animated:YES]; 
[self.mapView setVisibleMapRect:self.mapView.visibleMapRect edgePadding:UIEdgeInsetsMake(100, 20, 10, 10) animated:NO]; 

但它不工作,因爲我會希望。任何想法,我如何能做到這一點不同?

回答

11

你正在做正確的方法。 嘗試更改填充,您會看到區別。

別的辦法,必須有其他人在你的代碼更改視圖

編輯防止了一句:我是完全錯誤的。試試這個:

創建一個實例變量

BOOL _mapNeedsPadding; 

並初始化爲NO;

然後設置你的MapView委託給自己,並添加到您的類頭

然後添加到您的類

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{ 
    if(_mapNeedsPadding){ 
     _mapNeedsPadding = NO; 
     [self.mapView setVisibleMapRect:self.mapView.visibleMapRect edgePadding:UIEdgeInsetsMake(100, 20, 10, 10) animated:YES]; 
    } 
} 

最後打電話給你showAnnotations運作是這樣的:

_mapNeedsPadding = YES; 
[self.mapView showAnnotations:annotations animated:YES]; 

showAnnimation將觸發regionDidChangeAnimated函數。 您需要在更改visibleMapRect後將_mapNeedsPadding設置爲NO,因爲此函數(setVisibleMapRect:self)也會觸發regionDidChangeAnimated。

希望這會有所幫助!

+1

很好的回答!您可能需要在調用setVisibleMapRect之前設置_mapNeedsPadding = NO:在您的mapView上。否則會導致遞歸循環,導致訪問錯誤(我已編輯答案以反映相同。讓我知道,如果你不同意這個編輯) –

15

你也可以簡單地使用

[self.mapView showAnnotations:annotations animated:YES]; 
self.mapView.camera.altitude *= 1.4; 

縮小了一點。 適合我。

+2

即使經過近一年後對我來說:) –

10

從iOS8開始,MKMapView擁有layoutMargin屬性。設置此項時,centerRegion:,showAnnotations:以及試圖在地圖視圖中適合矩形的所有方法都會考慮上述佈局邊距。

如果您的半透明視圖的高度爲40點並附加到地圖視圖的頂部,設置mapView.layoutMargin = UIEdgeInsetMake(40, 0, 0, 0)將會發揮魔力。

如果以iOS7爲目標,地圖視圖使用其包含控制器的頂部和底部佈局指南來抵消其內容。因此,您可以覆蓋控制器的topLayoutGuide方法以返回所需的長度。

class ViewController: UIViewController { 
     override var topLayoutGuide: UILayoutSupport { 
     return MapLayoutGuide(length: 40) 
    } 
} 


class MapLayoutGuide: NSObject, UILayoutSupport { 
    var length: CGFloat 

    init(length: CGFloat) { 
     self.length = length 
     super.init() 
    } 

    @available(iOS 9.0, *) 
    var bottomAnchor: NSLayoutYAxisAnchor { 
     return NSLayoutYAxisAnchor() 
    } 
    @available(iOS 9.0, *) 
    var topAnchor: NSLayoutYAxisAnchor { 
     return NSLayoutYAxisAnchor() 
    } 
    @available(iOS 9.0, *) 
    var heightAnchor: NSLayoutDimension { 
     return NSLayoutDimension() 
    } 
} 
+1

我正在尋找這個'layoutMargin'無處不在,放棄後,試圖自己實現它。感謝你現在它正在工作,因爲它應該 – aytunch

+0

它絕對是檢查類,因爲它需要是相同的,以便接受mapView – malhal

+0

這也將移動蘋果地圖「法律」按鈕在左下角地圖,對我來說不是一個好的解決方案 – Aluminum