2014-01-15 95 views
0

我有一个大小为(320,182)的mapView。一旦按下了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]; 
    } 

这将显示从屏幕顶部向下滑动的地图视图。但是,如何在第二次按UIBarButtonItem时使mapView关闭?此外,我还想在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; 
}