如何将 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
,而不是 GCRect
。 CG
代表Core Graphics。
【讨论】:
出现此构建错误:将“__strong id”发送到不兼容类型“CGRect”(又名“struct CGRect”)的参数 这意味着target
是一个Obj-C 对象,而不是CGRect
。 target
是什么?
我将所有相关代码添加到 Qustion。对不起,它不完整;我通常不会遗漏所有代码
你在最后一个else
块中做什么?您正在向该方法发送target
。正如我所说,您必须发送CGRect
。
target 是传递给绘图方法的参数之一......我知道这很令人困惑,但这是我写问题时的错:-如果您查看我调用该方法的位置,您会发现它是一个 GCRect...【参考方案2】:
请问您为什么要发送 CGRect 并将其转换为“id”?哪里来的感悟?!我也希望将您的参数类型更改为 CGRect。
亲切的问候。
【讨论】:
以上是关于如何将 UIPopover 附加到我绘制的矩形的主要内容,如果未能解决你的问题,请参考以下文章