我正在尝试的内容和摘要:
您可以通过将我的代码复制并粘贴到新项目中来查看并运行我尝试的解决方案。
我试图通过使用 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/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge