Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在Interface Builder中启用NSScrollView以使用自动布局滚动其内容_Macos_Cocoa_Interface Builder_Autolayout_Nsscrollview - Fatal编程技术网

Macos 在Interface Builder中启用NSScrollView以使用自动布局滚动其内容

Macos 在Interface Builder中启用NSScrollView以使用自动布局滚动其内容,macos,cocoa,interface-builder,autolayout,nsscrollview,Macos,Cocoa,Interface Builder,Autolayout,Nsscrollview,我实现了一个自定义的NSView,其中包含许多NSTextFields和其他NSViews。然后,我使用编辑器>嵌入>滚动视图将该自定义视图嵌入到滚动视图中。这将创建在大纲中可见的适当层次结构,但我需要添加自动布局约束,以指定此滚动视图在视图中的位置(顶部、底部、前导、尾随)。此外,我还必须为自定义视图添加约束(针对剪辑视图设置),以便在正确的位置布置元素。这很好,当我运行应用程序时,所有元素都会正确显示,视图也会滚动。但是,当我降低主视图的高度以使并非所有元素都适合屏幕时,会出现自动布局警告,

我实现了一个自定义的
NSView
,其中包含许多
NSTextField
s和其他
NSView
s。然后,我使用编辑器>嵌入>滚动视图将该自定义视图嵌入到滚动视图中。这将创建在大纲中可见的适当层次结构,但我需要添加自动布局约束,以指定此滚动视图在视图中的位置(顶部、底部、前导、尾随)。此外,我还必须为自定义视图添加约束(针对剪辑视图设置),以便在正确的位置布置元素。这很好,当我运行应用程序时,所有元素都会正确显示,视图也会滚动。但是,当我降低主视图的高度以使并非所有元素都适合屏幕时,会出现自动布局警告,当我更新框架时,会再次增加视图的高度。为了解决这个问题,我必须删除滚动视图对主视图的底部约束。现在,当我运行应用程序时,窗口被设置为正确的大小,但我无法滚动自定义视图以到达内容的底部-它受到限制,因此除了弹性反弹效果之外,它根本不会滚动,因为您处于边缘限制。所以我的问题是,当我在XIB中布局所有元素并使用自动布局时,我必须做什么才能允许此滚动视图滚动?

以下是一般方法:

  • 使文档视图至少与剪辑视图一样高。或者,等效地,使剪辑视图不高于文档视图
  • 允许文档视图的高度增加,但不能缩小到其子视图所需的范围之外
  • 在其他约束条件下,使用低优先级约束使文档视图尽可能小,以防止文档视图中出现歧义
例如,剪辑视图的底部和文档视图的底部之间应该有一个约束,但它应该是一个不等式:Superview.bottom=Superview.bottom。)

在文档视图中,底部可能有一些文本字段或其他内容,并且在该字段和文档视图底部之间有一个约束。将该约束设为不等式:Superview.Bottom>=文本字段.Bottom+标准间距

这将导致文档视图的高度不明确。它可以是足够高的任意大小,以容纳其所有子视图。添加高度约束。将其优先级设置为51,常量设置为0。也就是说,它希望使视图具有0高度,但优先级非常低,因此几乎任何其他内容都将取代它。但它解决了模棱两可的问题

如果希望允许水平滚动,则需要在水平方向上执行相同的常规操作


更新:

还有另一种方法。在文档视图中配置约束,使其具有严格的大小(没有不平等)。这通常是一个约束链,从其顶部到顶部子视图,从该子视图的底部到另一个子视图的顶部,等等,从底部子视图的底部到文档视图的底部。导致拖尾的情况也一样

然后,剪辑视图和文档视图之间唯一必要的约束是顶部约束和前导约束

如果在此配置中进行测试,您将能够调整大小,并且滚动视图将滚动。所以,这很好。但是,当滚动视图的内容区域高于文档视图时,文档视图将固定在内容区域的底部。在那种情况下,你通常希望它别在上面

原因是剪辑视图未翻转。此外,它正在调整其边界以匹配文档视图。因此,即使存在将文档视图固定到剪辑视图顶部的约束,剪辑视图的顶部也不是您期望的位置。剪辑视图将文档视图放置在底部的(0,0)


因此,最后一步是创建一个子类
NSClipView
,该子类覆盖
-isfliped
以返回
YES
。然后,将NIB中剪辑视图的类设置为您的子类。之后,它将按照您的要求运行。

我将重新发布我的答案

查看2012年苹果开发者大会关于自动布局的视频,了解在代码中使用自动布局的信息

只需在Interface Builder或代码中使用我在本视频教程中记录的方法:

这是我在本视频中使用的方法:

  • 窗口--设置委托和IBOutlet属性

  • ScrollView--固定边,无边框,不绘制背景

  • documentView--固定边0,然后是另一个尾部和底部,clipView≥ 0@499和clipView≤ 0@501,用于documentView的尾部和底部约束

  • 水平堆栈视图中的标签和文本字段,垂直堆栈视图中的标签和文本字段

  • 垂直堆栈视图固定边默认,然后是另一个底部,底部≤ 默认值@499和≥ 默认值@750

  • 水平堆栈视图前导和尾随固定0

  • 标签和文本字段将Y中心与水平堆栈视图对齐

  • 文本字段顶部、底部和尾部2@750,宽度≥ 100,高度≥ 二十二

  • 后续水平堆栈视图前导和尾随固定对齐文本字段前导


  • 基于Ken Thomases的答案,使用Swift 4,可以将
    flipped
    作为用户定义的属性添加到NSClipView,以将内容固定到scrollview的顶部


    为了改进Ken的答案,我做了以下几点:

    •首先,我读了一篇关于如何使用自动布局在Interface Builder(IB)中设置NSScrollView的精彩文章

    •然后我做了以下工作:

    •在IB中创建了一个
    NSScrollView
    实例

    •创建了
    NSClipView
    的新子类,并添加了以下内容
    class ScCalendarClipView: NSClipView {
        open override var isFlipped: Bool {
            return true
        }
    } 
    
    // Right
    First Item: SuperView.Trailing
    Relation: Less Than or Equal
    Second Item: DocumentView.Trailing
    Constant: 0
    Priority: 510
    Multiplier: 1
    
    First Item: SuperView.Trailing
    Relation: Greater Than or Equal
    Second Item: DocumentView.Trailing
    Constant: 0
    Priority: 490
    Multiplier: 1
    
    // Left
    First Item: DocumentView.Leading
    Relation: Equal
    Second Item: SuperView.Leading
    Constant: 0
    Priority: 1000
    Multiplier: 1
    
    // Bottom (negative constants increase the size of the document view)
    First Item: SuperView.Bottom
    Relation: Less Than or Equal
    Second Item: DocumentView.Bottom
    Constant: -600
    Priority: 510
    Multiplier: 1
    
    // Bottom (constant should be equal to the bottom constraint above)
    First Item: SuperView.Bottom
    Relation: Greater Than or Equal
    Second Item: DocumentView.Bottom
    Constant: -600
    Priority: 490
    Multiplier: 1
    
    // Top
    First Item: DocumentView.Top
    Relation: Equal
    Second Item: SuperView.Top
    Constant: 0
    Priority: 1000
    Multiplier: 1