如何以编程方式在UIStackView中添加响应式UIPageViewController?

rgoldenb

我试图将UIPageViewController放在没有预定高度的UIView内。我要实现的目标是构建一个响应式应用内消息,该消息包含一个或多个组件(按钮,文本,轮播等),其高度由子代决定。

模态窗口可用于除UIPageViewController之外的所有组件。UIView会根据我放入的任何组件来调整大小,但不会在放置UIPageViewController时调整大小。似乎缺少一些约束。

总体层次结构为:

UIView (centered vertically on the screen with trailing and leading margins, no height)
|  UIStackView (inside this UIStackView I place any number of components I wish)
|  |  UILabel (example component)
|  |  UIButton (example component)
|  |  UIPageViewController (example component)
|  |  |  UIStackView (inside this UIStackView I place any other number of components)
|  |  |  |  UILabel (example component)
|  |  |  |  UIButton (example component)
…

以下日志摘录属于具有这些特征的应用内消息:

UIView (centered vertically on the screen with trailing and leading margins, no height)
|  UIStackView (leading and trailing anchors equal to parent, top and bottom anchors equal to children)
|  |  UIPageViewController (will display bellow the first slide content)
|  |  |  UIStackView
|  |  |  |  UIImageView
|  |  |  |  UILabel
|  |  |  |  UILabel

日志:

(lldb) po [[0x7feeb7a78e30 superview ] recursiveDescription]
<UIView: 0x7feeb76c44f0; frame = (0 0; 334 0); layer = <CALayer: 0x600002afd1c0>>
   | <_UIPageViewControllerContentView: 0x7feeb7a78e30; frame = (0 0; 334 0); clipsToBounds = YES; opaque = NO; autoresize = W+H; layer = <CALayer: 0x600002ae1500>>
   |    | <_UIQueuingScrollView: 0x7feeafbc6800; frame = (0 0; 334 0); clipsToBounds = YES; gestureRecognizers = <NSArray: 0x600002773600>; layer = <CALayer: 0x600002ae0e80>; contentOffset: {334, 0}; contentSize: {1002, 0}; adjustedContentInset: {0, -334, 0, -334}>
   |    |    | <UIView: 0x7feeb7a79b30; frame = (0 0; 334 0); layer = <CALayer: 0x600002ae04a0>>
   |    |    | <UIView: 0x7feeb7a79ca0; frame = (334 0; 334 0); layer = <CALayer: 0x600002ae0880>>
   |    |    |    | <UIView: 0x7feeb6f25990; frame = (0 0; 757 219.667); autoresize = W+H; layer = <CALayer: 0x600002aed700>>
   |    |    |    |    | <UIStackView: 0x7feeb6fb7a10; frame = (0 0; 757 219.667); layer = <CALayer: 0x600002aed8c0>>
   |    |    |    |    |    | <UIImageView: 0x7feeb76ceb70; frame = (0 0; 757 131.667); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x600002aff560>>
   |    |    |    |    |    | <UILabel: 0x7feeb76ced40; frame = (0 141.667; 757 29.6667); text = 'This is the first slide t...'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x600000bddb30>>
   |    |    |    |    |    | <UILabel: 0x7feeb6fb7c60; frame = (0 181.333; 757 18.3333); text = 'This is the description f...'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x600000bca0d0>>
   |    |    | <UIView: 0x7feeb7a79e10; frame = (668 0; 334 0); layer = <CALayer: 0x600002ae0840>>
   |    | <UIPageControl: 0x7feeb76cb9b0; frame = (10 -25; 314 20); autoresize = W; userInteractionEnabled = NO; gestureRecognizers = <NSArray: 0x600002693180>; layer = <CALayer: 0x600002afdac0>>
   |    |    | <_UIPageControlContentView: 0x7feeb6fb4b10; frame = (111.667 -3; 91 26); layer = <CALayer: 0x600002aed0c0>>
   |    |    |    | <_UIPageControlIndicatorContentView: 0x7feeb6fb73b0; frame = (14.3333 0; 62.6667 26); autoresize = H; layer = <CALayer: 0x600002aec080>>
   |    |    |    |    | <_UIPageIndicatorView: 0x7feeb6f27570; frame = (0.166667 8.16667; 9.66667 9.66667); opaque = NO; userInteractionEnabled = NO; tintColor = UIExtendedGrayColorSpace 0.333333 1; layer = <CALayer: 0x600002ae5b00>>
   |    |    |    |    | <_UIPageIndicatorView: 0x7feeb0809630; frame = (17.5 8.16667; 9.66667 9.66667); opaque = NO; userInteractionEnabled = NO; tintColor = UIExtendedGrayColorSpace 0.666667 1; layer = <CALayer: 0x600002a01000>>
   |    |    |    |    | <_UIPageIndicatorView: 0x7feeb6cd34c0; frame = (35.5 8.16667; 9.66667 9.66667); opaque = NO; userInteractionEnabled = NO; tintColor = UIExtendedGrayColorSpace 0.666667 1; layer = <CALayer: 0x600002a01080>>
   |    |    |    |    | <_UIPageIndicatorView: 0x7feeb6fc6100; frame = (53.1667 8.16667; 9.66667 9.66667); opaque = NO; userInteractionEnabled = NO; tintColor = UIExtendedGrayColorSpace 0.666667 1; layer = <CALayer: 0x600002ae0140>>

这是两个例子。第一个是没有UIPageViewController的有效应用内消息。第二个是我要实现的目标,但作为Android上的一个有效示例。

在不使用UIPageViewController的情况下处理应用内消息 在Android上轮播的工作示例

根据这些日志,有人能指出我纠正约束的正确方向吗?发生的情况是,层次结构中较高的视图的高度为0,而其子级的视图则没有。这将导致高度为0的应用内消息。

编辑

我将模式视图作为子视图添加到主视图,并将UIPageViewController添加到层次结构中的顶部控制器:

全部通过代码完成。我没有在主视图中添加视图控制器,仅添加了一个子视图:

UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
if (keyWindow != nil) {
    [keyWindow addSubview:self.parentView]; // self.parentView = blackish background + vertically centered UIView (the actual modal view) + UIStackView for the components
    if (hasCarousel){
        UIViewController *topController = [UIApplication getPresentedViewController];
        if (topController != nil)
            [topController embedViewController:pageViewController inView:carouselWrapper]; // carouselWrapper = UIView containing the pageViewController that is added to the UIStackView above

    }
}
唐马格

根据我们的评论提供答案...

AUIPageViewController加载并设置其“页面”控制器的视图大小。因此,尝试以另一种方式做到这一点-设置页面视图控制器的大小以匹配“页面”大小有点棘手。

另外,如果我们尝试对每个“页面”执行此操作,则框架将不断变化,并且(很可能)会带来不良的用户体验。

但是,我们可以预加载页面并计算最大页面高度以设置控制器。

概述代码为:

MutableArray *pages = [NSMutableArray new];
// however we load and initialize our page controllers
[pages addObject:FirstPageVC()];
[pages addObject:SecondPageVC()];
// etc

CGFloat maxHeight = 0;

CGSize fitSize = CGSizeMake(_carouselWrapper.frame.size.width, UILayoutFittingCompressedSize.height);

for (UIViewController *vc in pages) {
    // get size of page view
    CGSize sz = [vc.view systemLayoutSizeFittingSize:fitSize withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityDefaultLow];
    maxHeight = MAX(sz.height, maxHeight);
}

// if using the built-in PageControl
//  add height of PageControl + 1.5 (control is shown 1.5-pts below the view)
UIPageControl *c = [UIPageControl new];
maxHeight += [c sizeForNumberOfPages:1].height + 1.5;

// here we can set the height of the view frame for our PageViewController

我玩了一下,并在这里放置了一个工作示例项目:https : //github.com/DonMag/DynamicPGVC

尽管我将“ parentView”(我称其为OverlayView)作为一个单独的视图子类,但仍将大部分活动保留在主视图控制器之外,但您所显示内容的基本概念也是如此。

外观如下:

在此处输入图片说明

轻按“标签”按钮(细矩形显示“ carouselView”的框架):

在此处输入图片说明

点击“图像”按钮:

在此处输入图片说明

点击“页面视图控制器”按钮-第一个“页面”(“页面”很简单-带有标题和内容标签的垂直堆栈视图):

在此处输入图片说明

第二页显示内容的最大高度:

在此处输入图片说明

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何以编程方式在UIStackView中添加响应式UIPageViewController?

来自分类Dev

如何以编程方式在嵌入式tomcat中添加websocket端点?

来自分类Dev

如何以编程方式在表行中添加图像?

来自分类Dev

如何以编程方式在BigQuery表中添加字段描述

来自分类Dev

如何以编程方式在钛合金中添加控件

来自分类Dev

如何以编程方式在线性布局中添加TextView?

来自分类Dev

如何以编程方式在表行中添加图像?

来自分类Dev

如何以编程方式在multiselect中添加额外的选项

来自分类Dev

如何以编程方式向表中添加表行?

来自分类Dev

如何以编程方式在钛合金中添加控件

来自分类Dev

如何以编程方式在Android布局中添加新按钮

来自分类Dev

如何以编程方式从 Nautilus 书签中添加/删除项目?

来自分类Dev

如何以编程方式在 Lighthouse 中添加限制?

来自分类Dev

如何以编程方式添加序列?

来自分类Dev

如何以编程方式添加NSLayoutConstraints

来自分类Dev

如何以编程方式添加GestureOverlayView?

来自分类Dev

如何以编程方式添加NSMenu?

来自分类Dev

如何以编程方式添加imageview

来自分类Dev

如何以编程方式添加EditText?

来自分类Dev

如何以编程方式添加用户控件

来自分类Dev

如何以快速方式在UITabBarController中以编程方式添加选项卡?

来自分类Dev

如何以编程方式检测和响应聊天消息中的关键字

来自分类Dev

如何以编程方式发现OSGi中不满意的声明式服务引用

来自分类Dev

ActiveMQ:如何以编程方式监视嵌入式代理

来自分类Dev

如何以编程方式关闭沉浸式阅读器?

来自分类Dev

如何以编程方式将Inline图形添加到InDesign中的表格单元中

来自分类Dev

如何以编程方式在Android中添加两个视频

来自分类Dev

如何以编程方式将textBox添加到Grid中?

来自分类Dev

如何以编程方式向Java中的声音文件添加混响效果?

Related 相关文章

  1. 1

    如何以编程方式在UIStackView中添加响应式UIPageViewController?

  2. 2

    如何以编程方式在嵌入式tomcat中添加websocket端点?

  3. 3

    如何以编程方式在表行中添加图像?

  4. 4

    如何以编程方式在BigQuery表中添加字段描述

  5. 5

    如何以编程方式在钛合金中添加控件

  6. 6

    如何以编程方式在线性布局中添加TextView?

  7. 7

    如何以编程方式在表行中添加图像?

  8. 8

    如何以编程方式在multiselect中添加额外的选项

  9. 9

    如何以编程方式向表中添加表行?

  10. 10

    如何以编程方式在钛合金中添加控件

  11. 11

    如何以编程方式在Android布局中添加新按钮

  12. 12

    如何以编程方式从 Nautilus 书签中添加/删除项目?

  13. 13

    如何以编程方式在 Lighthouse 中添加限制?

  14. 14

    如何以编程方式添加序列?

  15. 15

    如何以编程方式添加NSLayoutConstraints

  16. 16

    如何以编程方式添加GestureOverlayView?

  17. 17

    如何以编程方式添加NSMenu?

  18. 18

    如何以编程方式添加imageview

  19. 19

    如何以编程方式添加EditText?

  20. 20

    如何以编程方式添加用户控件

  21. 21

    如何以快速方式在UITabBarController中以编程方式添加选项卡?

  22. 22

    如何以编程方式检测和响应聊天消息中的关键字

  23. 23

    如何以编程方式发现OSGi中不满意的声明式服务引用

  24. 24

    ActiveMQ:如何以编程方式监视嵌入式代理

  25. 25

    如何以编程方式关闭沉浸式阅读器?

  26. 26

    如何以编程方式将Inline图形添加到InDesign中的表格单元中

  27. 27

    如何以编程方式在Android中添加两个视频

  28. 28

    如何以编程方式将textBox添加到Grid中?

  29. 29

    如何以编程方式向Java中的声音文件添加混响效果?

热门标签

归档