アプリで MapView を使用して注釈を表示しています。iOS 7 では、コンパスがマップ上にランダムに表示されます。エラーはランダムに表示されるため再現できませんが、無効にしたいです。それを無効にする方法はありますか?
更新:ランダムに表示されるのではなく、特定のジェスチャーで表示されることがわかりました。2 本の指を使用して、一方を右に、もう一方を左にスライドさせます。
アプリで MapView を使用して注釈を表示しています。iOS 7 では、コンパスがマップ上にランダムに表示されます。エラーはランダムに表示されるため再現できませんが、無効にしたいです。それを無効にする方法はありますか?
更新:ランダムに表示されるのではなく、特定のジェスチャーで表示されることがわかりました。2 本の指を使用して、一方を右に、もう一方を左にスライドさせます。
プロパティを使用して、OSX 10.9 / iOS 9 以降でコンパスを簡単に無効にすることができshowsCompass
ます。
目的 C:
mapView.showsCompass = NO;
迅速:
mapView.showsCompass = false
この方法でコンパスを非表示にしても、カスタム MKCompassButton の動作と通常どおりの表示が妨げられることはありません。
iOS 8 以前では、次の選択肢があります。
それを吸って、それと一緒に暮らしてください。
次のようなハックを使用します。
マップを配置してコンパスを画面外に非表示にする(クレジットは Alex Wien に送られます)、または
マップのビュー階層をたどって、コンパスを表すビューを見つけて削除します(クレジットは David Topolansky に送られます)。
プログラムでマップを回転させておらず、まだ回転していない場合は、次を使用して回転を完全に無効にします。
mapView.rotateEnabled = NO;
コンパスはマップが回転したときにのみ表示されるため、これを行うことでコンパスがトリガーされないようにすることができます。
なぜ Apple が iOS でコンパスを非表示にできるようになるのをそんなに長く待ったのか、私にははっきりしない。あなたのケースで最も悪いと思うものを選んでください。
MKMapView
インスタンスのサブビューをトラバースしてコンパスを見つけるというMark Ameryのアイデアを使用し、ジェスチャ認識を使用して削除イベントをトリガーすることで、問題の解決策を見つけました。
コンパスを見つけるために、ビューの説明を印刷したところ、ビューの 1 つが のインスタンスであることがわかりましたMKCompassView
。これは明らかにコンパスでした。
私はあなたのために働くはずの次のコードを思いつきました。回転ジェスチャをチェックしてから、ジェスチャ イベントによってトリガーされたビュー イン メソッドを削除します。
私はこの方法をテストしましたが、うまく機能します:
- (void)viewDidLoad
{
[super viewDidLoad];
UIRotationGestureRecognizer *rotateGesture = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)];
[self.mapView addGestureRecognizer:rotateGesture];
}
-(void)rotate:(UIRotationGestureRecognizer *)gesture
{
if ([gesture state] == UIGestureRecognizerStateBegan || [gesture state] == UIGestureRecognizerStateChanged) {
// Gets array of subviews from the map view (MKMapView)
NSArray *mapSubViews = self.mapView.subviews;
for (UIView *view in mapSubViews) {
// Checks if the view is of class MKCompassView
if ([view isKindOfClass:NSClassFromString(@"MKCompassView")]) {
// Removes view from mapView
[view removeFromSuperview];
}
}
}
}
すべての iOS で viewDidLoad メソッドに以下の行を追加することで、マップを回転させているときに MKMapView でコンパスを非表示にすることができます。
[self.mapView setLayoutMargins:UIEdgeInsetsMake(-50, 0, -50, 0)];
ここで迅速なコード:
let mapRotateGesture = UIRotationGestureRecognizer(target: self, action: "didRotateMap:")
mapRotateGesture.delegate = self
self.map.addGestureRecognizer(mapRotateGesture)
func didRotateMap(gesture: UIGestureRecognizer) {
// Removeing compass
if (gesture.state == .Began || gesture.state == .Changed) {
for view in map.subviews as! [UIView] {
if view.isKindOfClass(NSClassFromString("MKCompassView")) {
view.removeFromSuperview()
}
}
}
}
私が理解しているように、あなたが望むのは、ユーザーの現在の場所を表示することを禁止することです。@property(nonatomic) BOOL showsUserLocation を使用する必要があります。 これに関するドキュメント
@property(nonatomic) MKUserTrackingMode userTrackingMode は追跡を有効または無効にできないと仮定します。これは、モードをフォローしない、フォローする、回転してフォローするの間で変更するだけです。