如何将 UIPopover 附加到我绘制的矩形

Posted

技术标签:

【中文标题】如何将 UIPopover 附加到我绘制的矩形【英文标题】:How to attach a UIPopover to a rectangle I have drawn 【发布时间】:2013-05-01 16:16:42 【问题描述】:

我有一个 iPad 应用程序(XCode 4.6、ios 6.2、ARC 和 Storyboards)。我在 UIView 的位置上绘制了一个 GCRect。

    CGRect rectangle = CGRectMake( [appSelected.aPosX floatValue], [appSelected.aPosY floatValue],[appSelected.aPosW floatValue], [appSelected.aPosH floatValue]);

我有一种方法可以为我绘图;这是该方法的代码:

-(void)showhtmlHelp:(NSString *)htmlString pointTo:(id)target background:(UIColor *)bgColor  

UIViewController* popoverContent = [[UIViewController alloc] init];
UIView* popoverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 300)];
popoverView.backgroundColor = [UIColor colorWithWhite:(CGFloat)1.0 alpha:(CGFloat)1.0];  //  frame color?
popoverContent.view = popoverView;

//resize the popover view shown in the current view to the view's size
popoverContent.contentSizeForViewInPopover = CGSizeMake(200, 300);

//  add the UIWebView for RichText
UIWebView *webView = [[UIWebView alloc] initWithFrame:popoverView.frame];
webView.backgroundColor = [UIColor whiteColor];  //  change background color here

//  add the webView to the popover
[webView loadHTMLString:htmlString baseURL:[NSURL URLWithString:nil]];
[popoverView addSubview:webView];

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

//present the popover view non-modal with a refrence to the button pressed within the current view
if([target isKindOfClass: [UITextField class]])
    [popoverController presentPopoverFromRect:((UITextField *)target).frame inView:self.view
                     permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
else if([target isKindOfClass: [UISegmentedControl class]])
    [popoverController presentPopoverFromRect:((UISegmentedControl *)target).frame inView:self.view
                     permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
else if([target isKindOfClass: [UIButton class]])
    [popoverController presentPopoverFromRect:((UIButton *)target).frame inView:self.view
                     permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
else 
    [popoverController presentPopoverFromRect:*(CGRect *)CFBridgingRetain(target)
                                       inView:self.view
                     permittedArrowDirections:UIPopoverArrowDirectionAny
                                     animated:YES];

现在我想让 UIPopover 指向那个矩形。由于 GCRect 是一个 C 结构,我不知道该怎么做。这是我尝试过的,但显然它是错误的。我怎样才能做到这一点?这是我调用方法来显示弹出框的代码:

    PreferencesViewController *pvc = [[PreferencesViewController alloc] init];
[pvc showHTMLHelp:html pointTo: rectangle background:[UIColor whiteColor]];

【问题讨论】:

target 的类型是什么?我假设你的意思是CGRect,而不是GCRect 已更新问题以显示 CGRectMake 的创建 【参考方案1】:

将 C 结构(或 C 原始变量)传递给 Objective-C 方法绝对没有问题。事实上,presentPopoverFromRect:inView:permittedArrowDirections:animated: 采用了一个简单的 CGRect,正如您可以从标题(或文档)中看出的那样:

- (void)presentPopoverFromRect:(CGRect)rect 
                        inView:(UIView *)view 
      permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections
                      animated:(BOOL)animated;

简单地这样称呼它:

[popoverController presentPopoverFromRect:rectangle
                                   inView:self.view
                 permittedArrowDirections:UIPopoverArrowDirectionAny
                                 animated:YES];

正如 Mar0ux 已经指出的那样,它是 CGRect,而不是 GCRectCG 代表Core Graphics。

【讨论】:

出现此构建错误:将“__strong id”发送到不兼容类型“CGRect”(又名“struct CGRect”)的参数 这意味着target 是一个Obj-C 对象,而不是CGRecttarget 是什么? 我将所有相关代码添加到 Qustion。对不起,它不完整;我通常不会遗漏所有代码 你在最后一个else 块中做什么?您正在向该方法发送target。正如我所说,您必须发送CGRect target 是传递给绘图方法的参数之一......我知道这很令人困惑,但这是我写问题时的错:-如果您查看我调用该方法的位置,您会发现它是一个 GCRect...【参考方案2】:

请问您为什么要发送 CGRect 并将其转换为“id”?哪里来的感悟?!我也希望将您的参数类型更改为 CGRect。

亲切的问候。

【讨论】:

以上是关于如何将 UIPopover 附加到我绘制的矩形的主要内容,如果未能解决你的问题,请参考以下文章

如何将 UIPopover 附加到以编程方式创建的 CGRect

如何正确关闭 UIPopover?

如何使用 EaselJS 绘制多边形?

Emgu CV 绘制旋转矩形

绘制矩形时如何避免颜色混合?

如何填充 UIBezierPath 中的重叠部分?