BOb*_*der 1 iphone tap objective-c uinavigationbar mkmapview
我想隐藏并显示导航栏,如照片应用程序中的那个,但不会丢失MKMapView的功能.用户应该仍然可以双击缩放,捏合和缩放,并能够选择注释.
我尝试过:
UITapGestureRecognizer* tapRec = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(hideBar:)];
[self.myMKMapView addGestureRecognizer:tapRec];
[tapRec release];
Run Code Online (Sandbox Code Playgroud)
但是,用户不能再选择注释了!它也隐藏了双击.
有任何想法吗 ?
我知道,这几乎是一年太晚了,但我希望有人可以利用它.基于@ Cocoanetics的答案,我就是这样做的:
BOOL mapReceivedDoubleTap;
Run Code Online (Sandbox Code Playgroud)
...
UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapMap:)];
[tapGestureRecognizer setDelegate:self];
[_mapView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer release];
Run Code Online (Sandbox Code Playgroud)
...
// ignore annotations
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
return (![[touch view] isKindOfClass:[MKAnnotationView class]]);
}
// take care of double taps for zoom
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if([otherGestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
UITapGestureRecognizer *tr = (UITapGestureRecognizer *)otherGestureRecognizer;
if(tr.numberOfTapsRequired == 2)
mapReceivedDoubleTap = YES;
}
return NO;
}
- (void)didTapMap:(UITapGestureRecognizer *)tapGestureRecognizer {
mapReceivedDoubleTap = NO;
// hide/show on delay
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, .2f * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
if(!mapReceivedDoubleTap)
[self.navigationController setNavigationBarHidden:!self.navigationController.navigationBarHidden animated:YES];
});
}
Run Code Online (Sandbox Code Playgroud)
迅速
import MapKit
class MapViewController: UIViewController, UIGestureRecognizerDelegate {
@IBOutlet weak var myMapView: MKMapView!
var mapReceivedDoubleTap = false
override func viewDidLoad() {
super.viewDidLoad()
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(MapViewController.didTapMap(_:)))
tapGestureRecognizer.delegate = self
myMapView.addGestureRecognizer(tapGestureRecognizer)
}
// ignore annotations
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
return !touch.isKindOfClass(MKAnnotationView)
}
// take care of double taps for zoom
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if otherGestureRecognizer.isKindOfClass(UITapGestureRecognizer) {
let tr = otherGestureRecognizer as! UITapGestureRecognizer
if tr.numberOfTapsRequired == 2 {
mapReceivedDoubleTap = true
}
}
return false
}
func didTapMap(gestureRecognizer: UIGestureRecognizer) {
mapReceivedDoubleTap = false
// hide/show on delay
let popTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.2 * Double(NSEC_PER_SEC)))
dispatch_after(popTime, dispatch_get_main_queue(), {
if !self.mapReceivedDoubleTap {
self.navigationController?.setNavigationBarHidden(!(self.navigationController?.navigationBarHidden)!, animated: true)
}
})
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1004 次 |
| 最近记录: |