2

我试图让弹出框出现在地图工具包注释点,但在注释视图属性中找不到“矩形”以使用调用 uipopovercontroller 的 rect 方法。如果在地图套件上给出注释,如何找到合适的“框架”?

为了给保罗更多信息,这是我的尝试:我已经使用过:

- (void)mapView:(MKMapView *)mapView2 annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control{
    NSLog(@"annotationView...");
    MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];
    int choice = 0;
    for (NSMutableDictionary *locationDictionary in [myGizmoClass searchResultsForResortLocation]) 
    {
        if([view.annotation.title isEqualToString:[locationDictionary objectForKey:@"name"]])
        {

            DetailViewTableStyleController *controller = [[DetailViewTableStyleController alloc] initWithlocationData:[[myGizmoClass searchResultsForResortLocation] objectAtIndex:choice] nibName:@"DetailViewTableStyle" bundle:[NSBundle mainBundle]];

            controller.categoryCode = [locationDictionary objectForKey:@"category_code"] ;

            //create a popover controller
            popoverControllerDetail = [[UIPopoverController alloc] initWithContentViewController:controller];

            // set contentsize
            [popoverControllerDetail setPopoverContentSize:CGSizeMake(320,480)];

            //present the popover view non-modal

            [popoverControllerDetail presentPopoverFromRect:view.rightCalloutAccessoryView.frame inView:mapView2 permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

            [controller release];
            break;
        }
        choice = choice + 1;
    }
}

而且...我在地图视图边缘的左上角得到一个弹出窗口。

谁能告诉我为什么?我试图让它出现在 pin/annotationview 附近。

4

5 回答 5

7

好的,

这是我迄今为止发现的唯一解决方法:

CGPoint annotationPoint = [mapView2 convertCoordinate:view.annotation.coordinate toPointToView:mapView2];
float boxDY=annotationPoint.y;
float boxDX=annotationPoint.x;
CGRect box = CGRectMake(boxDX,boxDY,5,5);
UILabel *displayLabel = [[UILabel alloc] initWithFrame:box];


[popoverControllerDetail presentPopoverFromRect:displayLabel.frame inView:mapView2 permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
[displayLabel release];

关于这一点的不好的部分是我假装把它放在注释的视图中。我只需获取注释视图的 annotation.coordinate(MKMapKit 样式坐标)并将坐标转换为屏幕坐标。然后,我创建了一个 uilabel(以在屏幕上获得一个支持框架的构造),并将其放置在 Annotation View 所在的位置。然后我告诉 popovercontroller 出现在该帧位置。

这是踢球者。我没有将 uilabel 添加到 mapView2。一旦 popovercontroller 绘制了自己,我就简单地释放它。

哈克,但干净。

于 2010-05-04T21:13:59.227 回答
2

此线程中第一个示例的问题在于对 presentPopoverFromRect:inView:permittedArrowDirections:animated: 的调用。inView: 参数的值不正确。它应该是 view.rightCalloutAccessoryView。

也就是说,矩形的坐标是相对于 rightCalloutAccessoryView 的。

通过此更改,行为将类似于看起来正确的地图应用程序。

于 2010-06-26T14:40:25.483 回答
1

如果你有MKAnnotationView, 并且你暗示你有,那么你可以使用它的frame属性,因为它是一个UIView子类。

于 2010-05-04T07:27:51.987 回答
1

没有阅读所有回复...但我遇到了类似的问题。当我点击标注气泡中的附件按钮时,我想显示一个弹出框。这就是我解决问题的方法。

首先,我将地图以我选择的注释为中心,我认为在这种情况下这总是一个好主意。然后我以固定大小实现弹出框并将其放置在正确的位置(在我看来)。

这是我的代码的一部分:

-(void)mapView:(MKMapView *)theMapView annotationView:(MKAnnotationView *)pin calloutAccessoryControlTapped:(UIControl *)control
{   
    UIViewController *detailController = [[detailedPinView alloc] initWithNibName:@"detailedPinView" 
                                                                           bundle:nil 
                                                                   annotationView:pin];

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
    {

        UIPopoverController* aPopover = [[UIPopoverController alloc] initWithContentViewController:detailController];
        [aPopover setDelegate:self];
        [aPopover setPopoverContentSize:CGSizeMake(320, 320) animated:YES];

        [detailController setPopover:aPopover];
        [detailController release];

        [mapView deselectAnnotation:pin.annotation animated:YES];

        self.popoverController = aPopover;

        [mapView setCenterCoordinate:pin.annotation.coordinate animated:YES];

        [self.popoverController presentPopoverFromRect:CGRectMake(382,498,0,0) inView:self.view  permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
    }
    else
    {
        [self presentModalViewController: detailController animated:YES];
    }


    [detailController release];
}
于 2010-05-09T20:57:49.553 回答
0

presentPopoverFromRect:inView:permittedArrowDirections:animated 的问题是,如果弹出框的内容大小大于适合屏幕的大小(例如,因为注释靠近屏幕边缘),系统将首先(在至少部分)忽略矩形,并将箭头的尖端放在视图中间的某个位置。我通过这样做解决了这个问题:

self.popover = [[UIPopoverController alloc] initWithContentViewController:placeDetailViewController];

[self.popover presentPopoverFromRect:CGRectMake(0, 0, 29, 31) inView:view.rightCalloutAccessoryView permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];

rightCalloutAccessoryView 通常是一个细节显示按钮,大小为 29 x 31。所以,我要做的是创建一个 29 x 31 的矩形,它覆盖了整个附件视图。然后我从附件视图中显示弹出框。通过将 29 增加到 40,弹出箭头将位于标注气泡之外,但前提是有足够的空间在屏幕上显示整个标注。如果没有,箭头将在气泡内移动。为了保持界面一致,我将宽度设置为 29。

于 2012-06-06T05:57:33.100 回答