- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试的内容和摘要:
您可以通过将我的代码复制并粘贴到新项目中来查看并运行我尝试的解决方案。
我试图通过使用 scrollViewDidScroll
方法来解决这个问题,该方法在表格 View 滚动时被重复调用。我设置了它,以便每次调用它时,它都会获取 TableView 顶部单元格的索引路径,如果此索引路径与上次调用该方法时不同(意味着一个新的单元格已到达顶部),将调用自定义方法 newPinFromScrolling
。此方法应该从最后一个顶部单元格中删除图钉,并在 map 上新顶部单元格中指定的坐标处放置一个新图钉。
我认为上面提到的两种方法对于任何试图解决这个问题的人来说都是最相关的。我的ViewDidLoad
主要是基础工作,但我还是尝试添加了一些解释性注释。
我的 ViewController.h 里什么都没有
ViewController.m
#import "ViewController.h"
#import <MapKit/MapKit.h>
#import "AnnotationClass.h"
@interface ViewController () <UITableViewDelegate,UITableViewDataSource,MKMapViewDelegate>
@end
@implementation ViewController
{
UITableView * myTableView;
NSMutableArray * coordinatesArray;
MKMapView * mapView;
CLLocationCoordinate2D centerLocation;
NSIndexPath * topRowIndexPath;
NSIndexPath * oldRowIndexPath;
UILabel * indexPathLabel;
UIView * labelContainerView;
}
- (void)viewDidLoad {
[super viewDidLoad];
//basic positioning stuff
labelContainerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 50)];
labelContainerView.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:labelContainerView];
indexPathLabel = [[UILabel alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2, 20, 50, 30)];
indexPathLabel.text = @"0";
[labelContainerView addSubview:indexPathLabel];
myTableView = [[UITableView alloc] initWithFrame:CGRectMake(0,(([UIScreen mainScreen].bounds.size.height - 50)/2) + 50, [UIScreen mainScreen].bounds.size.width, ([UIScreen mainScreen].bounds.size.height - 50)/2) style:UITableViewStylePlain];
[myTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"cell"];
myTableView.dataSource = self;
myTableView.delegate = self;
[self.view addSubview:myTableView];
mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 50, [UIScreen mainScreen].bounds.size.width, ([UIScreen mainScreen].bounds.size.height - 50)/2)];
mapView.delegate = self;
[self.view addSubview:mapView];
coordinatesArray = [@[] mutableCopy];
//random location to drop pins around
centerLocation = CLLocationCoordinate2DMake(37.72012665, -101.59623681);
//way of getting 25 random locations around the center location
for(int i=0;i<25;i++) {
CGFloat latDelta = rand()* .99/RAND_MAX - 0.02;
CGFloat lonDelta = rand()* .99/RAND_MAX - 0.08;
CLLocationCoordinate2D cellCoordinate = {centerLocation.latitude+latDelta, centerLocation.longitude+lonDelta};
//adding these coordinates to the table view array
[coordinatesArray addObject:[NSValue valueWithMKCoordinate:cellCoordinate]];
}
//dropping all the pins on the map before any scrolling happens
for ( int i=0; i<[coordinatesArray count]; i++)
{
CLLocationCoordinate2D annotationCoordinates = [[coordinatesArray objectAtIndex:i] MKCoordinateValue];
AnnotationClass * dropPin = [[AnnotationClass alloc] init];
dropPin.coordinate = annotationCoordinates;
[mapView addAnnotation:dropPin];
}
//set our viewing region
MKCoordinateRegion region = MKCoordinateRegionMake(centerLocation, MKCoordinateSpanMake(2.5, 2.5));
region = [mapView regionThatFits:region];
[mapView setRegion:region animated:NO];
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return coordinatesArray.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell * cell = [myTableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
CLLocationCoordinate2D cellCoordinate = [[coordinatesArray objectAtIndex:indexPath.row] MKCoordinateValue];
cell.textLabel.text = [NSString stringWithFormat:@"%f, %f", cellCoordinate.latitude, cellCoordinate.longitude];
return cell;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGPoint offset = myTableView.contentOffset;
//the line below gets the index path of the cell located at the y coordinate of the table view's origin (the cell touching the top)
topRowIndexPath = [myTableView indexPathForRowAtPoint:offset];
//offset.y > 0 because indexpath = null when offset is less than 0
if (topRowIndexPath != oldRowIndexPath && offset.y > 0) {
//this method gets called every time the index path changes
[self newPinFromScrolling];
//this label gets updated in real time
indexPathLabel.text = [NSString stringWithFormat:@"%lu",topRowIndexPath.row];
}
//oldRowIndexPath gets compared to topRowIndexpath next time this method is called
oldRowIndexPath = topRowIndexPath;
}
- (void)newPinFromScrolling {
//remove previous pins. This seems to happen "in real time" too.
[mapView removeAnnotations:mapView.annotations];
//below is all the code needed to drop a new pin on the map at the coordinates specified in the topmost cell. Some or all of it does not get called during the scroll event.
CLLocationCoordinate2D newPinCoordinates = [[coordinatesArray objectAtIndex:topRowIndexPath.row] MKCoordinateValue];
AnnotationClass * newPin = [[AnnotationClass alloc] init];
newPin.coordinate = newPinCoordinates;
//An NSLog of newPin.coordinate shows that the pin coordinates get updated in real time.
//It seems that this line here is the one that does not get called until the table view stops.
[mapView addAnnotation:newPin];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
注释类.h
#import <Foundation/Foundation.h>
#import <MapKit/MapKit.h>
@interface AnnotationClass : NSObject <MKAnnotation>
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
-(void)setCoordinate:(CLLocationCoordinate2D)newCoordinate;
@end
AnnotationClass.m
#import "AnnotationClass.h"
@implementation AnnotationClass
-(void)setCoordinate:(CLLocationCoordinate2D)newCoordinate
{
_coordinate = newCoordinate;
}
@end
结果:
newPinFromScrolling
确实在表格 View 滚动时“实时”调用。推测: 我想也许如果表格 View 滚动得足够快,手机将无法在顶部单元格被替换之前及时完成放置图钉所需的任务,但我的速度似乎并不重要正在滚动。 只要 table view 处于运动状态,pin 就不会掉落,即使它滚动得足够慢以致于完成任务。这几乎就像这些任务在滚动事件期间被禁用一样.
如果是这样,是否有任何方法可以强制手机尝试完成 newPinFromScrolling
方法中的任务?它们是否可以在单独的线程中完成,并在表格 View 滚动得太快时取消没有时间完成的线程?如果这样安排,那么我将开始研究降低表格 View 滚动速度的方法,这样“舞蹈”就不会被打断。
最佳答案
事实证明,更改图钉位置所需要做的就是更改其坐标(只需确保它已添加到 map 中)。每次索引路径更改时添加和删除它是不必要的。
关于ios - 在 UITableView 滚动时在 MKMapView 上放置图钉,从特定屏幕位置的单元格获取坐标。制作引脚 "dance.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29211893/
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
我的可执行 jar 中有一个模板文件 (.xls)。不需要在运行时我需要为这个文件创建 100 多个副本(稍后将唯一地附加)。用于获取 jar 文件中的资源 (template.xls)。我正在使用
我在查看网站的模型代码时对原型(prototype)有疑问。我知道这对 Javascript 中的继承很有用。 在这个例子中... define([], function () { "use
影响我性能的前三项操作是: 获取滚动条 获取偏移高度 Ext.getStyle 为了解释我的应用程序中发生了什么:我有一个网格,其中有一列在每个单元格中呈现网格。当我几乎对网格的内容做任何事情时,它运
我正在使用以下函数来获取 URL 参数。 function gup(name, url) { name = name.replace(/[\[]/, '\\\[').replace(/[\]]/,
我最近一直在使用 sysctl 来做很多事情,现在我使用 HW_MACHINE_ARCH 变量。我正在使用以下代码。请注意,当我尝试获取其他变量 HW_MACHINE 时,此代码可以完美运行。我还认为
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 9 年前。 要求提供代码的问题必须表现出对所解决问题的最低限度的理解。包括尝试过的解决方案、为什么
由于使用 main-bower-files 作为使用 Gulp 的编译任务的一部分,我无法使用 node_modules 中的 webpack 来require 模块code> dir 因为我会弄乱当
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 5 年前。 Improve this qu
我使用 Gridlayout 在一行中放置 4 个元素。首先,我有一个 JPanel,一切正常。对于行数变大并且我必须能够向下滚动的情况,我对其进行了一些更改。现在我的 JPanel 上添加了一个 J
由于以下原因,我想将 VolumeId 的值保存在变量中: #!/usr/bin/env python import boto3 import json import argparse import
我正在将 MSAL 版本 1.x 更新为 MSAL-browser 的 Angular 。所以我正在尝试从版本 1.x 迁移到 2.X.I 能够成功替换代码并且工作正常。但是我遇到了 acquireT
我知道有很多关于此的问题,例如 Getting daily averages with pandas和 How get monthly mean in pandas using groupby但我遇到
This is the query string that I am receiving in URL. Output url: /demo/analysis/test?startDate=Sat+
我正在尝试使用 javascript 中的以下代码访问 Geoserver 层 var gkvrtWmsSource =new ol.source.ImageWMS({ u
API 需要一个包含授权代码的 header 。这就是我到目前为止所拥有的: var fullUrl = 'https://api.ecobee.com/1/thermostat?json=\{"s
如何获取文件中的最后一个字符,如果是某个字符,则删除它而不将整个文件加载到内存中? 这就是我目前所拥有的。 using (var fileStream = new FileStream("file.t
我是这个社区的新手,想出了我的第一个问题。 我正在使用 JSP,我成功地创建了 JSP-Sites,它正在使用jsp:setParameter 和 jsp:getParameter 具有单个字符串。
在回答 StoreStore reordering happens when compiling C++ for x86 @Peter Cordes 写过 For Acquire/Release se
我有一个函数,我们将其命名为 X1,它返回变量 Y。该函数在操作 .on("focusout", X1) 中使用。如何获取变量Y?执行.on后X1的结果? 最佳答案 您可以更改 Y 的范围以使其位于函
我是一名优秀的程序员,十分优秀!