gpt4 book ai didi

ios - 在 UITableView 滚动时在 MKMapView 上放置图钉,从特定屏幕位置的单元格获取坐标。制作引脚 "dance."

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:16:47 25 4
gpt4 key购买 nike

我正在尝试的内容和摘要:

  • 我有一个包含 MKMapView 和子 UITableView 的 UIViewController。
  • 表格 View 中的每个单元格都包含一组坐标。
  • 我希望在 map 上顶部单元格中包含的坐标处放置一个图钉。
  • 我希望在表格 View 滚动时,图钉“实时”下降。当一个单元格到达某个 y 轴屏幕位置时,一个图钉会落在它的 map 坐标处,而当它离开这个 y 轴位置时,图钉会消失,并在下一个单元格的 map 坐标处被一个新图钉取代。
  • 期望的效果是随着表格 View 的滚动,图钉在 map 上的不同位置快速消失和重新出现(一次一个)。我称之为“跳舞”。
  • 我不希望在 y 位置选择单元格,因为我需要使用 didSelectRow 方法推送到新的 View Controller 。

您可以通过将我的代码复制并粘贴到新项目中来查看并运行我尝试的解决方案。

我试图通过使用 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 的滚动,新的图钉不会实时下降。只有当表格 View 完全停止时,它们才会掉落。
  • 我制作了一个标签,每次顶部单元格的索引路径发生变化时,它确实实时更新,所以我猜测手机在表格 View 滚动时实时更新的能力取决于关于任务的复杂性。

推测: 我想也许如果表格 View 滚动得足够快,手机将无法在顶部单元格被替换之前及时完成放置图钉所需的任务,但我的速度似乎并不重要正在滚动。 只要 table view 处于运动状态,pin 就不会掉落,即使它滚动得足够慢以致于完成任务。这几乎就像这些任务在滚动事件期间被禁用一样.

如果是这样,是否有任何方法可以强制手机尝试完成 newPinFromScrolling 方法中的任务?它们是否可以在单独的线程中完成,并在表格 View 滚动得太快时取消没有时间完成的线程?如果这样安排,那么我将开始研究降低表格 View 滚动速度的方法,这样“舞蹈”就不会被打断。

最佳答案

事实证明,更改图钉位置所需要做的就是更改其坐标(只需确保它已添加到 map 中)。每次索引路径更改时添加和删除它是不必要的。

关于ios - 在 UITableView 滚动时在 MKMapView 上放置图钉,从特定屏幕位置的单元格获取坐标。制作引脚 "dance.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29211893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com