私のテストは、MKMapView
それがどのようなコンテキストで表示されているかを何らかの形で知っていることを示しています。通常のコンパスを使用するUINavigationController
と、コンパスが半透明の場合でもナビゲーション バーの下に配置されます。
UIViewController
iOS 7 には、Y 軸上の実際のコンテンツの開始を定義する新しいプロパティがあります。といいtopLayoutGuide
ます。
残念ながら、Apple がさまざまなコンテンツでこのプロパティを計算するために使用する値に実際に影響を与えることはできません。また、ステータス バーの可視性にも依存します。
BUT:この問題を解決するために、カスタム ビュー コントローラーで返す単純なカスタム オブジェクトを作成しました。
@interface MiFixedLayoutGuide : NSObject <UILayoutSupport>
@property (nonatomic) CGFloat pbLength;
- (id)initWithLength:(CGFloat)length;
@end
@implementation MiFixedLayoutGuide
- (id)initWithLength:(CGFloat)length {
self = [super init];
if (self) {
_pbLength = length;
}
return self;
}
- (CGFloat)length {
return _pbLength;
}
@end
次に、UIViewController
サブクラスで次の 2 つのメソッドをオーバーライドしました。
- (id<UILayoutSupport>)topLayoutGuide {
return [[MiFixedLayoutGuide alloc]initWithLength:44];
}
- (id<UILayoutSupport>)bottomLayoutGuide {
return [[MiFixedLayoutGuide alloc]initWithLength:44];
}
これにより、レイアウト ガイドが 44 ポイント挿入されます。はMKMapView
これらの値を使用して、コンパスを上部に配置し、「法的」ラベルを下部に配置します。
ここで注意しなければならないことの 1 つは、自動レイアウト ビジュアル フォーマット言語内でレイアウト ガイドを使用できなくなったことです。