如何使用 UIPopoverArrowDirectionRight 或 UIPopoverArrowDirectionLeft 从 UITableViewCell 正确呈现弹出框
我总是尝试以这种方式从 tableView 内的单元格呈现弹出窗口:
[myPopover presentPopoverFromRect:cell.frame inView:self.tableView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
但我不能使用 UIPopoverArrowDirectionRight 或 Left,因为,取决于位置 ipad(纵向或横向)时,弹出窗口出现在其他位置。
我是否以正确的方式呈现弹出窗口?
PS:表视图位于 splitView 的详细视图中。
I always try to present a popover from a cell inside a tableView this way:
[myPopover presentPopoverFromRect:cell.frame inView:self.tableView permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
but I cannot use UIPopoverArrowDirectionRight or Left, because, depending on the position
of the ipad (portrait or landscape), the popover appears someplace else.
Am I presenting the popover the right way?
PS: the table view is in the detailView of a splitView.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
您可以通过 rectForRowAtIndexPath 方法从单元格获取框架。这是正确的。然而,表格视图很可能是较大 iPad 视图的子视图,因此当弹出窗口获取坐标时,它认为它们位于较大视图中。这就是弹出窗口出现在错误位置的原因。
例如,该行的 CGRect 为 (0,40,320,44)。弹出窗口不是针对桌面视图上的该框架,而是针对主视图上的该框架。
我通过将框架从表格的相对坐标转换为大视图中的坐标来解决这个问题。
代码:
希望能帮助其他人搜索这个问题。
You're getting the frame from the cell via the rectForRowAtIndexPath method. This is correct. However the tableview is most likely a subview of a larger iPad view so when the popover gets the coordinates it thinks they're in the larger view. This is why the popover appears in the wrong place.
Example, the CGRect for the row is (0,40,320,44). Instead of the popover targeting that frame on the tableview it instead targets that frame on your main view.
I solved this problem by converting the frame from the relative coordinates of the table to coordinates in my larger view.
code:
Hope that helps others searching for this issue.
在 Swift 中,在上述答案之间,这对我在任何方向的 iPad 上都适用:
In Swift, between the above answers this works for me on an iPad in any orientation:
我今天遇到了这个问题,我找到了一个更简单的解决方案。
实例化弹出窗口时,您需要指定单元格的内容视图:
I came across this problem today, and I've found a simpler solution.
When instantiating the popover, you need specify the cell's content view:
要在配件旁边弹出弹出窗口,您可以使用此代码:)
我将其用于更高级用途:
可用于UIActionSheet或UIPopoverController。
这是我的代码:
在 iOS 4.3 到 5.1 中测试
最好用作自定义方法:
以及方法代码:
To pop a popover next to the accesory u can use this code :)
I use this for more advanced use:
Can be use for UIActionSheet or UIPopoverController.
Here is my code:
Tested in iOS 4.3 to 5.1
Best to use as custom method:
And method code:
我也确实遇到过这个问题。对我来说,一个解决方案是简单地更改
CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath
返回的矩形的宽度:这会创建一个在单元格内居中的矩形。这样,弹出窗口就有更多机会找到合适的位置来定位自己。
I did come across this problem as well. A solution for me was to simply change the width of the rect returned by
CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath
:This create a rect centred inside the cell. This way, the popover has more chances of findind a good spot to position itself.
我遇到了同样的问题,这是我使用的解决方法:
这里是一个例子代码
在 MyCustomTableViewCell.m 中:
以及在 MyDetailViewController.m 中:
PS :当然,“操作”不必是 IBAction,并且弹出窗口源自的框架不必是 UIButton -一个 UIView 就很好了:)
I had the same kind of problem, here's the workaround i used :
here a example of code
In MyCustomTableViewCell.m :
and the, in MyDetailViewController.m :
PS : Of course, the 'action' doesn't have to be a IBAction, and the frame from where the popover originates doesn't have to be a UIButton - a single UIView would be good :)
这是对我来说效果很好的简单解决方案
Here is the simple solution which works fine for me
单元格框架将类似于 0,0,宽度,大小,我不相信它会有相对于 tableView 的 X 和 Y...你想使用 - (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath这,这应该返回相对于 tableView 的单元格的正确框架...这是一个链接 UITAbleView 参考
The cell frame is going to be something like 0,0,width,size, i dont believe it will have its X and Y relative to the tableView...you want to use - (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath for this, this should return you the correct frame for the cell relative to the tableView...here is a link UITAbleView ref
接受的答案现在无法编译。
The accepted answer cannot compile now.
这就是我所做的并且工作得很好。
This is how i did and works perfectly fine.
这也对我有用:
This also worked for me: