今晚我也面临了同样的问题,有几种解决方法(其中包括以老式方式呈现弹出框)。
对于这个示例,我有一个对象存储在我的自定义单元格类中。当选择该单元格时,我调用以下函数打开一个弹出视图控制器,显示关于该对象的详细信息,并将其指向表格中相应的单元格。
- (void)openCustomPopOverForIndexPath:(NSIndexPath *)indexPath{
CustomViewController* customView = [[self storyboard] instantiateViewControllerWithIdentifier:@"CustomViewController"];
self.myPopOver = [[UIPopoverController alloc]
initWithContentViewController:customView];
self.myPopOver.delegate = self;
MyCell *myCell = (MyCell*)[self.tableView cellForRowAtIndexPath:indexPath];
CGRect displayFrom = CGRectMake(myCell.frame.origin.x + myCell.frame.size.width, myCell.center.y + self.tableView.frame.origin.y - self.tableView.contentOffset.y, 1, 1);
[self.myPopOver presentPopoverFromRect:displayFrom
inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}
这种方法的问题在于我们经常需要popover视图具有自定义初始化器。这是一个问题,如果您想要在storyboard中设计视图而不是xib,并且具有一个自定义init方法,该方法以它的显示为参数使用单元格相关的对象。您也不能只使用popover segue(乍一看)因为您需要动态锚点(并且您无法锚定到单元格原型)。所以我做了以下操作:
- 首先,在您的视图控制器视图中创建一个隐藏的1px X 1px UIButton。(重要的是给按钮约束,使其可以在视图中移动到任何位置)
- 然后在您的视图控制器中为该按钮创建一个输出口(我称其为popOverAnchorButton),并从隐藏按钮向您希望segue到的视图控制器拖动一个segue。将其设置为弹出式segue。
现在您有一个带有“合法”锚点的popover segue,按钮是隐藏的,所以没有人会不小心触摸它,您只是用它作为锚点。
现在只需在您的函数中手动调用segue即可。
- (void)openCustomPopOverForIndexPath:(NSIndexPath *)indexPath{
MyCell *myCell = (MyCell*)[self.tableView cellForRowAtIndexPath:indexPath];
CGRect displayFrom = CGRectMake(myCell.frame.origin.x + myCell.frame.size.width, myCell.center.y + self.tableView.frame.origin.y - self.tableView.contentOffset.y, 1, 1);
self.popOverAnchorButton.frame = displayFrom;
[self performSegueWithIdentifier:@"CustomPopoverSegue" sender:myCell];
}
然后...... 瞧!现在你正在使用segue的魔力,拥有动态锚点,它似乎指向你的单元格。
现在在-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
中,您可以将sender简单地转换为您单元格的类(前提是您对sender类型进行适当检查并确定调用哪个segue),并将segue的destinationViewController设置为该单元格的对象。
如果这有帮助,请告诉我,或者任何人有任何反馈或改进意见。
webView
内特定“div”的弹出窗。我不使用frames
,而是采用约束和自动布局,这样更容易实现。 - Mike KeskinovCGPoint popoverCentre = CGPointMake(cell.center.x, cell.center.y + self.tableView.contentOffset.y); [self.popoverAnchorButton setCenter:popoverCentre];
- matt_s