问题标签 [uipresentationcontroller]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
121 浏览

swift - UIKitCore layoutGuides 死锁

我正在创建一个弹出菜单。它有一个在显示之前根据呈现的视图控制器的视图大小进行UIPresentationController计算。frameOfPresentedViewInContainerView

  • 呈现的视图控制器由固定高度的外部(导航)视图控制器嵌入一些动态高度的内部(内容)视图控制器组成;
  • 内部视图控制器,在引擎盖下,UIStackView包裹在UIScrollView;
  • 在计算内部视图控制器的大小之前,我正在调用layoutIfNeeded()它。

该问题仅发生在带有缺口的设备上(我责怪 safeAreaLayout),并且仅发生在基于 UIStackView 的内部视图控制器上。当layoutIfNeeded()在呈现的控制器上调用时(例如,当显示方向改变、内容大小改变或第二次呈现时)UIKitCore 进入无限循环调用-[UIView layoutGuides]。它不会使应用程序崩溃,而是使用 100% 的主线程并冻结 UI(有时整个手机都需要硬重置),每秒消耗大约 10Mb 的内存。

我能够通过frameOfPresentedViewInContainerView. 这听起来像是一个糟糕的修复,所以我试图更好地理解这个问题。

如果对 UIKit 有深入了解的人可以为我指出如何调试/调查问题的更好策略,我会很高兴。


更新

由于安全区域,似乎UIScrollView很难定位内容。UIKitCore 不断重复这 5 行:

我也有

0 投票
1 回答
873 浏览

ios - 拖动以关闭 UIPresentationController

我制作了一个适合任何视图控制器的 UIPresentationController 并使用本教程显示在屏幕的一半上。现在我很想添加阻力来消除这一点。我试图让拖动感觉自然且响应迅速,就像 Apple iOS 13 股票应用程序上“热门故事”的拖动体验一样。我认为要关闭的 iOS 13 模态拖动会被延续,但它不会传递给这个控制器,但事实并非如此。

我发现的每一段代码和教程都有一个糟糕的拖动体验。有谁知道如何做到这一点?过去一周我一直在尝试/寻找。先感谢您

这是我的演示控制器代码

0 投票
1 回答
101 浏览

ios - UIPresentationController 呈现导航控制器视图

在 iOS 14 上,当呈现一个模态导航控制器、非全屏、自定义 UIPresentationController 和 modalPresentationStyle 时,导航栏会考虑到安全区域的顶部插图(即使 prefersStatusBarHidden 为 true)。因此,在呈现的视图顶部有一个等于状态栏高度的间隙。

有任何想法吗?

0 投票
0 回答
97 浏览

cgaffinetransform - iOS 14 在自定义视图控制器演示期间处理转换的方式有什么不同吗?

作为学习 UIPresentationController(及其关联的自定义视图控制器演示对象)的一部分,我想我会重新创建 Apple 的 iOS 13 默认模式演示样式。它在iOS 12 和 13上运行得很好,但是在 iOS 14 上我得到了这种奇怪的感觉(还要注意如何将presentingVC snap 放到它应该有的正确位置)。有什么改变吗?应用转换的相关代码是:

值得注意的是,展示第一个 VC(视频以它已经展示的开头)效果很好,展示一个新的 VC 也是如此。

编辑:已解决!多亏了这条评论,原来这是一个转换错误。

0 投票
0 回答
72 浏览

ios - 使用 UIPresentationController 时如何允许父视图的手势仍然有效/不被禁用?(复制 Apple 地图功能)

试图复制 Apple Maps 功能,并带有底部覆盖层。

我已经能够创建自定义 UIPresentationController 并让底部工作表出现,但现在底部工作表似乎阻止了父/呈现视图控制器的所有手势。

这是一个模拟屏幕截图:

在此处输入图像描述

地图注释、菜单按钮(右上角)和地图本身不响应手势、轻按平移或其他方式。搜索栏和分段控制选项卡工作正常。

这是我的 UIPresentationController 和委托:

以及我如何呈现/初始化协调员的观点

我已经尝试从 UIGestureRecognizerDelegate 的“shouldRecognizeSimultaneouslyWith”中返回 true ......但我不知道如何访问 MapView 和 UIButton 的内置手势以设置委托。

如何让 mapKit 和我的菜单按钮的手势/点击工作?

谢谢,

0 投票
0 回答
114 浏览

ios - 在子视图控制器中使用自定义 UIPresentationController 呈现模态 UIViewController

我创建了一个自定义UIPresentationController子类来处理UIViewController. 这按预期工作,但是当我尝试从不覆盖整个屏幕的子视图控制器中呈现此视图控制器时遇到问题。预期的行为是视图会以模态方式显示在其呈现的子视图控制器的边界内,但模态视图会从根视图控制器全屏呈现。

视图控制器如下所示:

在内部看来,iOS 正在查看视图堆栈并在设置definesPresentationContext为 true 的视图控制器上进行设置。如果我将子视图控制器设置definesPresentationContext为 true,这似乎没有效果。始终选择根视图控制器。

如果我将我modalPresentationStyleoverCurrentContext模式设置为确实仅限于子视图控制器边界,但是我的自定义过渡委托动画不会被使用。

我觉得这里一定有一些简单的东西我想念?

0 投票
0 回答
24 浏览

ios - 如何使自定义 UIPresentationController 在未从窗口中删除时不调用演示者视图生命周期方法(viewDidDisappear)?

我正在使用自定义转换来呈现模态视图,其中呈现的 VC不覆盖整个屏幕并且演示者的视图没有被删除。它与系统默认的模态演示样式(又名工作表/卡片)非常相似。

当我使用系统的默认模态演示样式时,viewDidDisappear不会在演示者 VC 上调用。viewDidDisappear但是,当我调用时,我的自定义转换确实会触发endAppearanceTransition- 即使它的视图从未从屏幕上移除。

如何模仿系统的转换行为?我不应该在自定义转换中使用beginAppearanceTransitionandendAppearanceTransition方法吗?

0 投票
0 回答
21 浏览

ios - 有没有办法防止我的主视图控制器在解雇后与状态栏发生冲突?

我目前正在使用自定义演示控制器,该控制器在演示期间使用缩放和平移变换,并在解雇期间将其删除。每当在呈现 VC 时发生某些系统操作(例如关闭 NC、点击状态、进入多任务屏幕或移动到另一个应用程序然后返回),主 VC 会布置其子视图,就好像没有状态栏存在一样. 然后当我解散顶级VC时,主VC的顶部内容与状态栏发生冲突。我之前尝试过一些方法来重置它(在主 VC 视图和我的应用程序窗口上调用 setNeedsLayout 和 layoutIfNeeded),但它们没有用。但是有效的方法(如视频中解雇结束后 2 秒所见)正在删除主 VC 的视图并将其添加到其超级视图中,

我的问题是,是否有它的布局,就好像解雇期间状态栏在那里一样?由于主题更改,我目前在演示和解雇阶段直接使用我的视图。这是该行为的视频

目前,我可以通过在顶部安全区域约束(通常使用的)和附加到 VC 视图顶部的另一个顶部约束之间切换活动来防止我的自定义导航栏发生这种情况,其高度为常数状态栏。我在主 VC 视图的删除和添加到其父视图之间执行此切换。这也是一个视频

问题仍然是表格视图的插图。由于我无法确定何时忽略状态栏(查询状态栏的高度总是返回正确的值,即使它明显被忽略),我无法正确更新插图,也无法隐藏它们的周期性错误像我可以为导航栏设置的限制。

0 投票
2 回答
1321 浏览

ios - 在 UISheetPresentationController 中自定义较小的 Detents?

苹果终于在 2021 年的 iOS 15 中发布了一个苹果地图风格的“底页”控件:UISheetPresentationController

这种类型的纸张本身支持“止动”,即纸张自然放置的高度。默认large()定位表示全屏显示,而medium()定位覆盖大约一半的屏幕。

但是,API 中没有small()止动。

Apple Maps 和类似应用程序通常会在屏幕底部显示一个完全折叠的小工作表,可以将其拖动到半高,也可以将其拖动到全屏。Apple Maps 实际上显示了一个 1/3 高度的屏幕,这似乎与medium()棘爪不同。

Apple Maps 小型折叠底板

使用UISheetPresentationController而不是任何 3rd 方重新实现底部表格,如何在屏幕底部显示带有 Apple Maps 风格的折叠小棘爪的表格?

0 投票
1 回答
43 浏览

ios - iOS - 如何在不更改下面的 UIViewController 的情况下传递点击手势?

我有两个视图控制器,B 显示在 A 之上,但不是全屏显示。我正在使用UIPresentationController来自定义 B 的框架。我想要的是,当点击 A 时,B 被解除并且 A 响应它自己的点击手势。

如何在 B 和 UIPresentationController 中实现这一点,而不触及 A 的代码?

我尝试为 B 添加全屏背景视图,但不知道如何在不更改 A 的情况下向下传递点击手势。

在此处输入图像描述