我继承了一个xcode项目,其作者用iOS 6.1编译。我知道apple已经stopped接受使用iOS6 SDK构建的项目,但无论出于何种原因,我现在仍需要使用iOS 6.1来编译它
无论如何,一切正常,直到我需要使用didTapMyLocationButtonForMapView:方法(当用户点击我的位置按钮时通知我),这似乎只有最新的谷歌地图SDK < / strong>版本 1.7.2 (我无法在项目附带的gmaps sdk中找到该方法,所以我只需用最新的库替换旧库)。
然而,在这之后我开始得到这个编译错误:
架构i386的未定义符号:&#34; _glMapBufferRange&#34;, 引自: GoogleMaps(BufferObject.o)中的gmscore :: renderer :: BufferObject :: MapBuffer()ld:找不到架构的符号 i386 clang:错误:链接器命令失败,退出代码为1(使用-v to 见调用)
网络上有些claim,这是因为1.7.2 与不兼容iOS6。但是,查看gmaps SDK的release notes ..我没有看到1.7.2与iOS 6不兼容的任何迹象 - 请注意版本1.5的发布说明如何明确说明
此版本正式支持iOS 7,需要iOS 6.0或更高版本 (不再支持iOS 5.1)。
但iOS 6没有找到此类免责声明。
知道这里发生了什么?
答案 0 :(得分:0)
我最终制作谷歌地图1.7.2与iOS 7一起工作(我不记得究竟是怎么回事,但这很容易...通常在得到这些未定义的架构问题时......我解决了他们通过支持arm 64并将有效架构设置为no)然后那没有解决我的问题b / c didTapMyLocationButtonForMapView:方法是一个哑巴:它在谷歌地图1.7中不起作用.2(即当用户点击我的位置按钮时......没有任何反应)。
注意:所以,如果你在这里的唯一原因是验证谷歌地图1.7.2是否适用于iOS7我可以告诉你它确实有效。本答案的其余部分是关于如何在不使用谷歌地图1.7.2 didTapMyLocationButtonForMapView:
方法点击mylocationButton时触发回调,如果使用1.7.2或之前的话,无论版本
所以我又回到了旧版本的谷歌sdk(我没有其他理由升级)..并创建了我自己的代码,当用户点击我的位置按钮时会触发。这是它的工作原理(简而言之......我重写UIApplication sendEvent
方法,当用户触摸屏幕时会触发该方法,并捕获与myLocation按钮在同一维度发生的事件..然后去从那里)
首先我创建了一个自定义UIApplication
类:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, NSStringFromClass([TPMUApplication class]), NSStringFromClass([TPMUAppDelegate class]));
}
}
<强> TPMUApplication.h 强>
@interface TPMUApplication : UIApplication
// the view controller that has the google maps in it
@property (nonatomic, strong) TPMUVC *VC;
@end
<强> TPMUApplication.m 强>
#import "TPMUApplication.h"
#import "TPMUVC.h"
@implementation TPMUApplication
- (void)sendEvent:(UIEvent *)event
{
[super sendEvent:event];
UIView *touchReceipientView =((UITouch *)[event.allTouches anyObject]).view;
CGRect myLocationButtonFourchIncFrame = CGRectMake(256, 354, 64, 54);
CGRect myLocationButtonThreeHalfIncFrame = CGRectMake(256, 266, 64, 54);
if (CGRectEqualToRect(touchReceipientView.frame, myLocationButtonFourchIncFrame) ||
CGRectEqualToRect(touchReceipientView.frame, myLocationButtonThreeHalfIncFrame)) {
if (self.tVC.mapState != TPMUMapStateInMotionAsResultOfMyLocationButtonTap) {
self.VC.mapState = TPMUMapStateInMotionAsResultOfMyLocationButtonTap;
[self.VC didTapMyLocationButtonForMapView:self.VC.mapView];
}
}
}
@end
<强> TPMUVC.h 强>
#import <CoreLocation/CoreLocation.h>
#import <GoogleMaps/GoogleMaps.h>
typedef enum
{
TPMUMapStateIdle = 0,
TPMUMapStateInMotionAsResultOfUserGesture,
TPMUMapStateInMotionAsResultOfMyLocationButtonTap
} TPMUMapState;
@interface TPMUVC : TPMUBaseViewController<GMSMapViewDelegate>
@property (nonatomic, strong) GMSMapView *mapView;
@property (nonatomic, assign) TPMUMapState mapState;
- (BOOL)didTapMyLocationButtonForMapView:(GMSMapView *)mapView;
<强> TPMUVC.m 强>
#import "TPMUApplication.h"
@implementation TPMUVC
@synthesize mapView = mapView_;
@synthesize mapState = mapState_;
- (void)viewDidLoad
{
TPMUApplication *tpmuApp = (TPMUApplication *)[UIApplication sharedApplication];
tpmuApp.taxiRequestVC = self;
}
#pragma mark - GMSMapView delegate
- (void)mapView:(GMSMapView *)mapView willMove:(BOOL)gesture
{
if (gesture) {
mapState_ = TPMUMapStateInMotionAsResultOfUserGesture;
}
}
- (void)mapView:(GMSMapView *)mapView idleAtCameraPosition:(GMSCameraPosition *)position
{
if (mapState_ == TPMUMapStateInMotionAsResultOfUserGesture) {
mapState_ = TPMUMapStateIdle;
}
mapState_ = TPMUMapStateIdle;
mapCameraPosition_ = position;
DLog(@"map is now idle at position [lat: %f,long: %f] zoom: %f", position.target.latitude, position.target.longitude, position.zoom);
}
- (BOOL)didTapMyLocationButtonForMapView:(GMSMapView *)mapView {
return YES;
}