2013-10-02 5 views
1

Я ищу какой-то метод делегата, который будет запущен, когда под просмотр будет добавлено в представление. Мне нужно это, потому что представление компаса на карте iOS7 добавляется в mapview, когда оно начинает вращаться (оно не было ранее и не скрыто). Однако, когда я пытаюсь манипулировать видом компаса в regionWillChangeAnimated, он не запускается, пока пользователь не отпустит карту.Ищете метод делегата subviewsDidChange

В основном мне нужно что-нибудь по строкам: subviewWasAdded, subviewsDidChange, или что-то в этом роде.

EDIT: После принятия предложения Daij-Djan я сделал MPOMapView.m и MPOMapView.

#import "MPOMapView.h" 

@implementation MPOMapView 

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code 
    } 
    return self; 
} 

- (void)addSubview:(UIView *)view { 
    [super addSubview:view]; 

    [self moveCompass:&view]; 
} 


- (void)moveCompass:(UIView **)view { 

    if([[[UIDevice currentDevice] systemVersion] floatValue] < 7) { 
     return; 
    } 

    if(![*view isKindOfClass:NSClassFromString(@"MKCompassView")]) { 
     return; 
    } 

    //Gets here 
    NSLog(@"Was the compass"); 

    float width = (*view).frame.size.width; 
    float height = (*view).frame.size.height; 

    (*view).frame = CGRectMake(40, self.frame.size.height - 50, width, height); 

    //Frame doesn't change 
    NSLog(@"Frame should change"); 
} 

@end 

Метод вызывается, но рамка не изменяется. Я также пробовал:

- (void)addSubview:(UIView *)view { 
    [super addSubview:view]; 

    [self moveCompass:view]; 
} 


- (void)moveCompass:(UIView *)view { 

    if([[[UIDevice currentDevice] systemVersion] floatValue] < 7) { 
     return; 
    } 

    if(![view isKindOfClass:NSClassFromString(@"MKCompassView")]) { 
     return; 
    } 

    //Gets here 
    NSLog(@"Was the compass"); 

    float width = view.frame.size.width; 
    float height = view.frame.size.height; 

    view.frame = CGRectMake(40, self.frame.size.height - 50, width, height); 

    //Frame doesn't change 
    NSLog(@"Frame should change"); 
} 

, но это тоже не сработает. И, наконец ....

- (void)addSubview:(UIView *)view { 
    [super addSubview:[self movedCompass:view]]; 
} 


- (UIView *)movedCompass:(UIView *)view { 

    if([[[UIDevice currentDevice] systemVersion] floatValue] < 7) { 
     return view; 
    } 

    if(![view isKindOfClass:NSClassFromString(@"MKCompassView")]) { 
     return view; 
    } 

    //Gets here 
    NSLog(@"Was the compass"); 

    float width = view.frame.size.width; 
    float height = view.frame.size.height; 

    view.frame = CGRectMake(40, self.frame.size.height - 50, width, height); 

    //Frame doesn't change 
    NSLog(@"Frame should change"); 

    return view; 
} 

не работает либо

+0

@Mike_V вам удалось получить ваше приложение принято с вашим кодом доступ частному классу MKCompassView таким образом? Мне нужно сделать то же самое для публичного приложения. – pnizzle

ответ

2

там нет такого делегата.

НО

все, что вы можете сделать, это подкласс MKMapView и осуществлять insertSubview и addSubview и строить свои собственные решения.

НО

см лучший способ

- (void)layoutSubviews { 
    [super layoutSubviews]; 

       if([[[UIDevice currentDevice] systemVersion] floatValue] < 7) { 
        return; 
       } 

    for(id view in self.subviews) { 
       if(![view isKindOfClass:NSClassFromString(@"MKCompassView")]) { 
        continue; 
       } 

       [self moveCompass:view]]; 
    } 
} 

- (void)moveCompass:(UIView *)view { 
    //Gets here 
    NSLog(@"Was the compass"); 

    float width = view.frame.size.width; 
    float height = view.frame.size.height; 

    //view.frame = CGRectMake(40, self.frame.size.height - 50, width, height); 
    view.frame = CGRectMake(40, self.bounds.size.height - 50, width, height); 

} 
+0

Я попробую это и приму ответ, если закончится работа над нами. Благодаря! –

+0

Пожалуйста, см. Мое редактирование –

+0

ah Я вижу, что вы хотите сделать :) просто сохраните указатель на представление в addSubview и реализуйте layoutViews ... Я редактирую свой код за секунду. –

0

Я не знаю, будет ли это работать, купить вы можете попробовать использовать значение ключа Наблюдения с MapView-х camera, который имеет свойство heading.

+0

Tried '[self.mapView.camera addObserver: self forKeyPath: @" заголовок ": NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context: nil]; 'и' - (void) observValueForKeyPath: (NSString *) keyPath ofObject: (id) изменение объекта: (NSDictionary *) изменить контекст: (void *) context { NSLog (@ "Путь к ключу:% @ ", keyPath); } ', но ничего не напечатано –

+0

Спасибо за попытку. Жаль, что это не сработало, но хорошо знать, что на карте нет KVO. –

2

Daij-Djan отправил правильный ответ, заслужив его!

Это просто улучшение на то, что я чувствую себя слишком много кода:

- (void)layoutSubviews 
{ 
    [super layoutSubviews]; 

    for(id view in self.subviews) 
    { 
     if([view isKindOfClass:NSClassFromString(@"MKCompassView")]) 
      [self moveCompass:view]]; 
    } 
} 

- (void)moveCompass:(UIView *)view 
{ 
    //change compass frame as shown by Daij-Djan 
} 
Смежные вопросы