我正在为iPhone和iPad构建一个通用应用程序的自定义GUI。在iPad上,它在内容操作、detailInformation等实用工具方面严重依赖"sideViews“(比如高级SplitView)。从视觉上看,新的UIPresentationController非常适合于让我展示这些"sideViews“(而不是使用dimmedView),而且实现很容易构建和维护,同时仍然很好地与故事板集成。但是,我需要能够在presentingViewController可见时操纵presentedViewController的内容。因此,我的问题是,我是否可以在presentingViewController上设置presentingViewController(或类似的),同时显示sideViews?
发布于 2015-07-08 11:33:13
UIPresentationController将其容器视图插入为呈现视图之上的窗口子视图,因此任何与呈现视图外部的接触都会被容器视图所困,永远不会到达呈现视图。
修复方法是在容器视图上插入一个视图,该视图通过与呈现视图的接触传递。您可以将其用作调光视图,也可以将其backgroundColor设置为完全透明视图的[UIColor clearColor]。在演示文稿控制器代码中设置通通视图。
@interface IVPasserView : UIView
@property (strong, nonatomic) NSArray* passthroughViews;
@end
@implementation IVPasserView
- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
UIView* hit = [super hitTest:point withEvent:event];
if (hit == self)
for (UIView* passthroughView in _passthroughViews)
{
hit = [passthroughView hitTest:[self convertPoint:point toView:passthroughView]
withEvent:event];
if (hit)
break;
}
return hit;
}
@end注意:虽然这违背了-[UIView hitTest:withEvent:]的精神,因为它不返回子视图,但这实际上是系统标准UIPopoverPresentationController处理它的方式。如果您在那里设置了passthroughViews属性,容器视图将使用通通视图响应hitTest:withEvent:,即使它们不是superview/子视图!因此,它很可能在下一个iOS发行版中存活下来。
发布于 2016-10-25 20:50:45
模态演示不适合你的情况。最好用自定义容器视图控制器实现您的场景,并覆盖showDetailViewController:sender:方法来处理其他视图控制器的表示。您可以将此方法用于在iPhone上显示视图控制器模型,例如在iPad上显示右边的视图控制器模型。
以下是苹果文档的摘录
呈现与显示视图控制器 UIViewController类提供了两种显示视图控制器的方法: 显示视图控制器:发送方:和显示showDetailViewController:发送方:方法提供了显示视图控制器的最自适应和最灵活的方法。这些方法让呈现视图控制器决定如何最好地处理表示。例如,容器视图控制器可能将视图控制器合并为子控件,而不是以模式方式呈现它。默认行为以模型方式显示视图控制器。现在视图控制器:动画:完成:方法总是以模式显示视图控制器。调用此方法的视图控制器可能最终不会处理表示,但表示始终是模态的。此方法适用于水平紧凑环境的表示样式。显示视图控制器:发送方:和显示showDetailViewController:发送方:方法是启动演示文稿的首选方法。视图控制器可以调用它们,而不知道视图控制器层次结构的其余部分或当前视图控制器在该层次结构中的位置。这些方法还使在应用程序的不同部分重用视图控制器变得更容易,而无需编写条件代码路径。
发布于 2015-02-16 06:50:43
好的,看来UIPresentationController的想法是不能将它作为高级SplitView使用(或者至少这是我目前的结论)。不过,我还是设法想出了解决办法。如果有人找到更好的方法来处理这个问题,请在评论中告诉我。
因此,我所做的就是将PresentingViewController的视图插入到索引0的transitionContexts containerView (与UIPresentationControllers containerView相同)的层次结构中。这使我能够透明地在PresentingViewControllers视图中处理PresentingViewControllers。但是它将PresentingViewControllers视图从其原始视图层次结构中移除,所以当演示文稿被取消时,我需要将它移回那里。这意味着如果存在,则将视图返回到parentViewController的视图,或者如果presentingViewController是应用程序的rootViewController,则将视图放到应用程序的窗口中(可能还有其他场景,但现在可以这样做)。
所有这些都是在animateTransition中的UIViewControllerAnimatedTransitioning中完成的。
下面是代码:
UIView.animateWithDuration(transitionDuration(transitionContext),
delay: 0.0,
usingSpringWithDamping: 1.0,
initialSpringVelocity: 0.5,
options: UIViewAnimationOptions.BeginFromCurrentState|UIViewAnimationOptions.AllowUserInteraction,
animations: { () -> Void in
animatingView.frame = finalFrame
}) { (finished:Bool) -> Void in
if !self.isPresentation {
if let parentViewController = backgroundVC.parentViewController {
parentViewController.view.addSubview(backgroundVC.view)
}
else if let window = (UIApplication.sharedApplication().delegate as! AppDelegate).window {
window.addSubview(backgroundVC.view)
}
fromView.removeFromSuperview()
}
else {
containerView.insertSubview(backgroundVC.view, atIndex: 0)
}
transitionContext.completeTransition(true)
}https://stackoverflow.com/questions/28500507
复制相似问题