【问题标题】:changing a UIScrollView inner view dynamically within an Xcode 6 storyboard在 Xcode 6 故事板中动态更改 UIScrollView 内部视图
【发布时间】:2014-11-23 04:49:20
【问题描述】:

所以我想使用滚动视图,同时自动将它的宽度适应每个设备的屏幕尺寸。

所以在 iPhone 6+ 和 iPhone 5 上,UIScrollView 内的内部 UIView 将填充 UISCrollView 的宽度。 UIView 和 UIView 内对象的约束应重新定位内部内容以适应实际的最终宽度。

我遇到的问题是我知道如何使 UIScrollView 适应它所在的屏幕,并且我知道如何创建 UIView 中的对象对 UIView 本身的约束,而这些似乎上班。
但是 - 我不知道如何使包含内容的 UIView 更改其宽度以适应 UIScrollView。

在 scrollView 和直接的孩子 UIView 之间设置约束没有帮助。我认为这是因为他们在 Apple 网站上进行了“内容”与“框架”的讨论”
更改代码中的框架参数被忽略(可能是因为它是 AutoLayout 故事板的一部分):

var currSize = contentView.frame;
currSize.size.width = UIScreen.mainScreen().bounds.width;
contentView.frame = currSize;

如上所述,我确实希望在内部 UIView 中有自动布局,
我确实希望 UIScrollView 适合整个屏幕。

我该怎么办??

-> 我想配置“视图”以适应它所在的“滚动视图”的大小,但是任何 AutoLayout 约束的配置都是错误的(因为它不适用于内容大小)并且代码由于 auto 被忽略布局。

这些是对象和约束:

【问题讨论】:

    标签: ios swift xcode6


    【解决方案1】:

    问题是你没有给内容视图任何宽度/高度限制。只要提供它们,一切都会好起来的。

    您不理解的是,“内容视图”的边缘与其周围的滚动视图之间的约束具有特殊含义——它们决定了滚动视图的contentSize。他们不会做你想做的事——他们对内容视图的大小没有任何影响。内容视图必须从内向外获取它的大小,就像它一样。这可能是由于其子视图的约束(可以说是向外推)或其自身的宽度和高度约束。

    【讨论】:

    • 不能给,因为事先不知道..要看屏幕大小..又会变化...
    • @evenro:屏幕宽度/高度约束开箱即用,根据我的回答,本身没有任何动态。这只是普通的自动布局,在这方面问题似乎是重复的。
    • 必须提前知道。内容视图的大小是滚动视图的contentSize。如果你不提供这个,滚动视图将不会滚动。
    • @evenro 不要试图编辑我的答案来给出你的答案。如果您想给出不同的答案,请给出不同的答案!
    • 如果您真的阅读了我编辑的内容 - 只是添加代码以执行您所说的操作,为那些想要实现它的人节省一些时间......但没问题 - 在另一个答案中添加了它.
    【解决方案2】:

    所以, 为了解决这个问题,需要做很多事情(正如其他答案中所讨论的,但没有其他人为它提供代码的好意):

    1. scrollView 本身应该有对屏幕边缘的约束。
    2. 内部 UIView 中的对象应该有自己的约束。
    3. 在代码中,添加所需大小的约束(难怪为什么 Microsoft 开发环境要好得多.. 从来不必为了简单的东西而使用这种东西)。

    代码是:

            // Change width
            var strConstraintWidth = "H:[contentView(==";
            strConstraintWidth = strConstraintWidth + UIScreen.mainScreen().bounds.width.description;
            strConstraintWidth = strConstraintWidth + ")]";
    
            let viewDictWidth = ["contentView":contentView];
            let widthConstraint:Array = NSLayoutConstraint.constraintsWithVisualFormat(strConstraintWidth, options: NSLayoutFormatOptions(0), metrics: nil, views: viewDictWidth);
            contentView.addConstraints(widthConstraint);
    
            // Check if Height constraint is necesarry
            let contentHeight = UIScreen.mainScreen().bounds.height - (adBanner.frame.size.height + 18.0);
            if (contentView.bounds.height < contentHeight)
            {
                var strConstraintHeight = "V:[contentView(==";
                strConstraintHeight = strConstraintHeight + contentHeight.description;
                strConstraintHeight = strConstraintHeight + ")]";
    
                let viewDictHeight = ["contentView":contentView];
                let heightConstraint:Array = NSLayoutConstraint.constraintsWithVisualFormat(strConstraintHeight, options: NSLayoutFormatOptions(0), metrics: nil, views: viewDictHeight);
                contentView.addConstraints(heightConstraint);
            }
    
            mainScrollView.contentSize = contentView.bounds.size;
    

    【讨论】:

    • 没有给出代码,至少从你的问题来看,没有代码是必要的——你可以用 IB 来完成。
    • 另外,你不应该在使用 AL 时直接设置 contentSize,并且你在添加约束之前没有先删除旧的约束,所以如果在方向更改期间运行代码,你会得到重复的 /冲突的约束。
    【解决方案3】:

    我几乎无法理解你的问题,但如果你问如何在滚动视图中使用自动布局,答案会在多个位置得到回答,从苹果文档到 SO,快速搜索会告诉你:

    不过,简短的版本是您需要将边缘内容视图锚定到父滚动视图,并设置其高度和宽度以匹配父滚动视图。 IE。你需要6个约束。自动布局不是一头容易驯服的野兽,但这方面确实有效。

    编辑:(根据评论中的说明)

    要在开始时或以后影响内容大小,您可以使用该维度的布局约束(宽度或高度约束),或者(根据我对文档的阅读)通过在内容视图。自然,约束可以大于内在内容大小。

    请注意,使用单个内容视图来收集任何子内容视图通常更容易,因为这将使您更容易控制大小。默认情况下,自动布局将通过(我相信)将滚动视图的任何直接子项的上述固有大小相加来计算有效的内容视图大小,如果您有任何子内容视图的单个容器,则更容易。

    作为说明,我有一个图表视图,我想有效地跨越两个页面或设备宽度。我将约束设置为顶部、右侧、底部、左侧、高度,然后将宽度设置为主/滚动视图宽度的两倍(这本身就是屏幕宽度)。因此,对于我的测试宽度 320,内容视图宽度为 640(减去边距等)。我设置了 2x 约束,首先使用 IB 创建默认约束,然后在右侧检查器的布局选项卡中编辑宽度约束的乘数属性。

    【讨论】:

    • 很清楚如何在滚动视图中的视图中使用自动布局,也很清楚如何更改滚动视图的大小以适应区域。唯一不清楚的是如何更改作为滚动视图的直接子级的 UIView 的大小。假设您有一个宽度为 320 的 UIView,我希望它在其他设备上显示时拉伸。我知道如何设置规则让它伸展,我知道如何设置 UIScrollView 伸展,但我不知道哪个约束会让 UIView 去做。
    • 此外,我尝试运行的所有代码“setContentSize”将框架初始化为特定大小,都被忽略(在 Xcode 6 中)
    • FWIW,使用明确的引用更容易阅读(contentView,父滚动视图,而不是有两个的“视图”,当思想被收集成线性段落时,不会循环太多. 评论更清楚了,帖子仍然不够连贯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多