2014-01-15 3 views
0

У меня есть mapView, размер которого (320, 182). Как только нажимается UIBarButtonItem, я хотел бы показать, что этот mapView скользит вниз от вершины экрана. Для этого я написал такой код.Показать половину экрана экрана, который скользит вниз сверху

UIBarButtonItem *mapButton = [[UIBarButtonItem alloc] 
           initWithImage:[UIImage imageNamed:@"map_1.png"] 
           style:UIBarButtonItemStylePlain 
           target:self 
           action:@selector(showMap:) 
           ]; 
    self.navigationItem.rightBarButtonItem = mapButton; 


    -(void)showMap:(id)sender{ 
     self._mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0,-182,320,182)]; 
     [self.scrollView addSubview:self._mapView]; 

     //show view 
     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationBeginsFromCurrentState:YES]; 
     [UIView setAnimationDuration:1.0]; 
     CGRect rect = [self._mapView frame]; 
     rect.origin.y = 0; 
     [self._mapView setFrame:rect]; 
     [UIView commitAnimations]; 
    } 

Это покажет вид карты, который скользит вниз от верхней части экрана. Однако, как мне сделать mapView уволить, когда во второй раз нажали UIBarButtonItem? Более того, я также хотел бы отклонить mapView, когда выходил за пределы mapView.

ответ

2

Это является варьироваться в базовой реализации того, что вы просите. Но это будет трюк.

#import "ViewController.h" 
#import "MKMapView.h" 

@interface ViewController() { 
    MKMapView *mapView; 
    BOOL showingMap; 
} 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // 
    UIBarButtonItem *mapButton = [[UIBarButtonItem alloc] 
            initWithTitle:@"Map" 
            style:UIBarButtonItemStylePlain 
            target:self 
            action:@selector(toggleMap:) 
            ]; 
    self.navigationItem.rightBarButtonItem = mapButton; 

    UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissView:)]; 
    [self.view addGestureRecognizer:tapRecognizer]; 
} 

-(void)toggleMap:(id)sender{ 
    if (!mapView) { 
     mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0,-182,320,182)]; 
     mapView.backgroundColor = [UIColor redColor]; // red background for testing 
     [self.view addSubview:mapView]; 
    } 

    CGRect rect = mapView.frame; 
    rect.origin.y = showingMap ? -rect.size.height : 0; 

    showingMap = !showingMap; 

    [UIView animateWithDuration:1.0 delay:0.0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ 
     mapView.frame = rect; 
    } completion:^(BOOL finished) { 

    }]; 
} 

- (void)dismissView:(UITapGestureRecognizer*)recognizer { 
    // bail out since map isn't showing 
    if (!showingMap) return; 

    CGPoint pt = [recognizer locationInView:self.view]; 
    UIView *v = [self.view hitTest:pt withEvent:nil]; 

    if (![v isKindOfClass:[MKMapView class]]) { 
     NSLog(@"dismiss"); 
     [self toggleMap:nil]; 
     return; 
    } 
} 

@end 
+0

Это сработало! Большое вам спасибо за помощь. – kenken

0

Просто обратный анимации (которые вы должны делать в более современных блочных методов):

rect.origin.y = -182; 
[UIView animateWithDuration:1.0 animations^{ 
    self.mapView.frame = rect; 
} 
Смежные вопросы