Ответ 1
Мои тесты показали, что MKMapView
как-то знает, в каком контексте он отображается. Если вы используете обычный UINavigationController
, вы получите компас, расположенный под панелью навигации, даже если он полупрозрачен.
В iOS 7 существует новое свойство UIViewController
, которое определяет начало фактического содержимого по оси Y. Он называется topLayoutGuide
.
К сожалению, вы не можете реально повлиять на значение, которое Apple использует для расчета этого свойства в другом содержимом. Это также зависит от видимости строки состояния.
НО: Чтобы решить эту проблему, я создал простой пользовательский объект, который я возвращаю в свой настраиваемый контроллер представлений:
@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
:
- (id<UILayoutSupport>)topLayoutGuide {
return [[MiFixedLayoutGuide alloc]initWithLength:44];
}
- (id<UILayoutSupport>)bottomLayoutGuide {
return [[MiFixedLayoutGuide alloc]initWithLength:44];
}
Вставляет направляющие макета на 44 пункта. И MKMapView
будет использовать эти значения для позиционирования компаса вверху и метки "Legal" внизу.
Одна вещь, на которую вы должны обратить внимание, заключается в том, что вы больше не можете использовать руководства по макету на языке автоматического отображения макета.