将uipopovercontroller的箭头放在mapkit上的注释点

时间:2010-05-04 06:36:34

标签: ipad sdk mapkit frame uipopovercontroller

我试图让一个弹出框出现在地图工具包注释点但是在注释视图属性中找不到“rect”来使用调用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;
    }
}

而且......我在mapview边缘的左上角有一个弹出窗口。

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

5 个答案:

答案 0 :(得分: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];

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

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

黑客,但干净。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

如果您拥有MKAnnotationView,并且暗示您这样做,那么您可以使用其frame属性,因为它是UIView子类。

答案 3 :(得分: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];
}

答案 4 :(得分:0)

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

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

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

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