我们偶然发现了这样的问题.
我们正在开发一个旅行应用程序.为了确保用户不会在我们的应用程序中花费太多钱来漫游费用,我们决定为用户实现一个设置选项,仅用于查看缓存的地图.因此,我们让用户决定是否要从互联网加载地图,或者他想省钱并查看缓存地图(存储在Library/Caches/MapTiles/MapTiles.sqlitedb中).
我们找不到实现这个的方法.在这种情况下,有没有办法以编程方式禁用网络?或者强制MapKit仅使用缓存切片?我们考虑过以编程方式为此选项更改APN以强制MapKit脱机.是否有可能以编程方式更改APN?
谢谢!
我正在开始一个使用coreLocation和mapkit框架的新应用程序.
我的问题是试图让当前的速度总是给我一个负值,我把我的iPhone带到一个有3g信号的地方并没关系,location.speed值总是-1.
这是重要的代码:
#define kRequiredAccuracy 1500.0 //meters
#define kMaxAge 60.0 //seconds
Run Code Online (Sandbox Code Playgroud)
在init方法中:
self.locationManager=[[CLLocationManager alloc] init];
self.locationManager.delegate=self;
self.locationManager.desiredAccuracy=kCLLocationAccuracyNearestTenMeters;
Run Code Online (Sandbox Code Playgroud)
然后didUpdateToLocation:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{
NSTimeInterval ageInSeconds = [newLocation.timestamp timeIntervalSinceNow];
NSLog(@"Location: %@", [newLocation description]);
if( newLocation.horizontalAccuracy > kRequiredAccuracy || fabs(ageInSeconds) > kMaxAge )
{
NSLog(@"inacurate position");
[self.delegate inacuratePosition];
}
else {
[self.delegate locationUpdate:newLocation andOldLocation:oldLocation];
location=newLocation.coordinate;
}
if(tracking)
{
[self updatePosition];
}
if(firstTime)
{
[self placeStartMark];
firstTime=FALSE;
}
}
Run Code Online (Sandbox Code Playgroud)
最后在我正在实现协议的视图控制器中:
- (void)locationUpdate:(CLLocation *)newLocation andOldLocation:(CLLocation*)oldLocation{
double speed = [newLocation speed] *3.6;
double …Run Code Online (Sandbox Code Playgroud) 如果我有一个MKMapView和一个CLLocationCoordinate2D,你如何测试地图的可见区域是否包含坐标?
我在使用MKMapView和MKMapCamera时注意到了奇怪的行为.我需要实现一些Apple Maps应用程序的标准行为.基本上,我需要的是当Map View的用户跟踪模式设置为MKUserTrackingModeFollowWithHeading时能够在2D和3D模式之间切换.
目前,我的解决方案在userTrackingMode设置为MKUserTrackingModeNone时工作正常,但它在其他模式下执行奇怪的动画(无论我使用setCamera:动画:是或否)都会发生这种情况.当我在设置new之前和之后记录相机参数时,唯一的区别是我的音高变化.
另一个问题是改变摄像机的高度以编程方式放大或缩小.我试图在IBAction方法中使用捏合或缩小手势来模仿缩放.在followWithHeadingMode中,地图始终返回"默认"缩放级别(摄像机的高度),而在其他模式下效果很好.
我启动了示例项目来检查发生了什么,这是我的单视图应用程序的视图控制器,带有地图视图,其中出现问题:
#import "CCViewController.h"
@interface CCViewController ()
@end
@implementation CCViewController
- (void)viewDidLoad{
[super viewDidLoad];
}
- (void)setUpMap{
[self.mapView setShowsUserLocation: YES];
}
- (void)viewDidAppear:(BOOL)animated{
[self setUpMap];
}
- (IBAction)mapModeSwitchClicked:(id)sender {
MKMapCamera *newCamera = [MKMapCamera camera];
newCamera.centerCoordinate = self.mapView.camera.centerCoordinate;
newCamera.heading = self.mapView.camera.heading;
newCamera.altitude = self.mapView.camera.altitude;
if(!self.mapView.camera.pitch){
newCamera.pitch = 50;
self.mapModeSwitch.title = @"2D";
}
else{
newCamera.pitch = 0;
self.mapModeSwitch.title = @"3D";
}
[self.mapView setCamera:newCamera animated:YES];
}
- (IBAction)locateMeButtonClicked:(id)sender {
if(self.mapView.userTrackingMode != MKUserTrackingModeFollowWithHeading)
[self.mapView …Run Code Online (Sandbox Code Playgroud) 当我需要制作时MKCoordinateRegion,我会做以下事情:
var region = MKCoordinateRegion
.FromDistance(coordinate, RegionSizeInMeters, RegionSizeInMeters);
Run Code Online (Sandbox Code Playgroud)
很简单 - 效果很好.
现在我希望存储当前区域范围的值.当我查看该region.Span值时,它MKCoordinateSpan具有两个属性:
public double LatitudeDelta;
public double LongitudeDelta;
Run Code Online (Sandbox Code Playgroud)
如何将LatitudeDelta价值转换为latitudinalMeters请?(那么我可以使用上面的方法重新创建我的区域(稍后)...
我正在尝试构建一个API,以便了解是否CLLocation代表土地.我需要这个离线工作,因为我希望我的大多数用户都没有连接.我使用MapBox作为tile服务器,但这仍然是一个MapKit问题,因为我没有使用MapBox SDK.
我已经尝试了几种方法来确定给定坐标是代表陆地还是海洋位置:
另外(在上面的处理之后)是否有一种有效的方法来决定给定一个瓦片坐标(x,y,z)是否是陆地/海洋/海岸瓦片?
如果有人一直在努力解决这个问题,我会在此提出一些建议.
我正在MKAnnotationView我的项目中创建一个子类.它需要有两个属性来存储子视图,我需要在开头的某个地方进行初始化.
MKAnnotationView在其文档中列出了一个初始化程序initWithAnnotation:reuseIdentifier:,所以我想我只是覆盖它:
class PulsatingDotMarker: MKAnnotationView {
let innerCircle: UIView
let outerCircle: UIView
override init!(annotation: MKAnnotation!, reuseIdentifier: String!) {
innerCircle = ...
outerCircle = ...
super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
}
...
}
Run Code Online (Sandbox Code Playgroud)
但这会导致运行时异常:
致命错误:对'PulsatingDotMarker'类使用未实现的初始化程序'init(frame :)'
好的,所以我猜initWithAnnotation:reuseIdentifier:内部调用initWithFrame:,所以可能是我应该覆盖的那个.我们试试看:
class PulsatingDotMarker: MKAnnotationView {
let innerCircle: UIView
let outerCircle: UIView
override init(frame: CGRect) {
innerCircle = ...
outerCircle = ...
super.init(frame: frame)
}
...
}
Run Code Online (Sandbox Code Playgroud)
但是,这会在创建注释视图对象时导致编译错误:
调用中的额外参数'reuseIdentifier'
嗯,所以如果我实现(必需的)初始化器initWithFrame:,它现在会丢失默认的初始化器initWithAnnotation:reuseIdentifier:?
也许如果我添加一个覆盖initWithAnnotation:reuseIdentifier:,只是调用super …
我把个人形象改为传统的红色别针.当我打开地图以显示图钉时,图像会覆盖整个地图.是否有最大尺寸的引脚图像或如何在代码中集成某些东西以适应尺寸标准的经典引脚?
func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
if annotation is MKUserLocation {
return nil
}
let annotationIdentifier = "SomeCustomIdentifier" // use something unique that functionally identifies the type of pin
var annotationView: MKAnnotationView! = mapView.dequeueReusableAnnotationViewWithIdentifier(annotationIdentifier)
if annotationView != nil {
annotationView.annotation = annotation
} else {
annotationView = MKAnnotationView(annotation: annotation, reuseIdentifier: annotationIdentifier)
annotationView.image = UIImage(named: "pin maps.png")
annotationView.canShowCallout = true
annotationView.calloutOffset = CGPointMake(-8, 0)
annotationView.autoresizesSubviews = true
annotationView.rightCalloutAccessoryView = UIButton(type: UIButtonType.DetailDisclosure) as UIView
}
return annotationView
}
Run Code Online (Sandbox Code Playgroud) 快速更新,因为我看到很多人对此感兴趣,因为iOS 10已经上线了.我最终开了一个TSI,Apple今天回复说明我应该为此打开一个bug.他们没有提供任何有关变通方法的进一步信息或建议,其含义是这里存在问题.
与此同时,我仍在寻找一种解决方法.我将整个布局从StackView中拉出来并替换为自动布局约束,只是遇到了同样的问题.问题可能出在MapView上.
我有一个问题,在垂直StackView中放置一些标签和MapView.此视图与iOS 10/Xc8的行为不一致.
在6/S模拟器上,它正确呈现.在SE上,MapView实际上看起来比在6上更大,它掩盖了标签.旋转后解决(在故事板预览中显示正常)
我用一个非常简单的项目演示了这种行为.它包含一个Storyboard视图,其中包含一个垂直StackView,如下所示:
StackView使用Fill对齐和Fill分布.没有间距.
每个标签的内容拥抱优先级为251,抗压缩性为750.
在MapView具有250内容拥抱和750压缩.
我试过玩这些数字,但它从来没有奏效.理论上,它MapView具有最低的拥抱优先级,因此它应该用Fill分布消耗所有额外的空间.
相反,这就是我所看到的(在SE SIM上)
如果我旋转设备并返回 - 它看起来很好.所以看起来布局有一些时间问题.但是,我在这里没有做任何代码 - 标签的文本是硬编码的storyboard.我在代码中没有做任何事情.
如上所述,它在iPhone6上看起来很好.如果我随意调整标签的高度,它看起来也很好.我注意到当标签fontsize特别相同时,它很好.所以我想知道它是否使用初始标签fontsize来计算内在contentsize或类似的东西.
iPad Air sim也存在问题.事实上,整个地图最初都被地图覆盖,我根本看不到标签(直到旋转).
我不确定是否ScrollViews应该很好地配合StackViews.这就是说,我也尝试拉MapView离开那里,并阻断它的下方StackView用autolayout.令人惊讶的是,我有相同的最终结果.
最后的注意事项 - 我没有使用示例项目对此进行测试,但在我的原始项目中(表现出相同的行为),这发生在Xcode 8中,而不是在Xcode 7中.
我正在地图应用程序中工作,该应用程序在地图上呈现折线.我在缩放时遇到问题,它会将先前的折线保留在图块上.
我试图强制重绘:
[self.mapView reloadInputViews];
[self.mapView.layer setNeedsDisplay];
[self.mapView setNeedsDisplay];
Run Code Online (Sandbox Code Playgroud)
我也尝试减慢变焦速度,但问题仍然存在:
[MKMapView animateWithDuration:2
delay:0
usingSpringWithDamping:0.6
initialSpringVelocity:10
options:UIViewAnimationOptionCurveEaseOut
animations:^{
[self.mapView setVisibleMapRect:unionRectThatFits
edgePadding:UIEdgeInsetsMake(20, 10, 20, 10)
animated:YES];
}
completion: nil];
Run Code Online (Sandbox Code Playgroud)
有谁知道这个?
mapkit ×10
ios ×8
iphone ×4
mkmapview ×4
autolayout ×1
cocoa-touch ×1
geo ×1
geolocation ×1
google-maps ×1
initializer ×1
ios10 ×1
ios5 ×1
mapbox ×1
mkannotation ×1
scrollview ×1
swift ×1
swift2 ×1
uistackview ×1
xcode7 ×1