使用 Visual AutoLayout 在 NSScrollView 中布局多个视图

2023-12-11

我需要显示内部垂直对齐的多个视图NSScrollView,我首先添加NSTableView and NSButton。我将它们垂直对齐NSTableView在顶部和NSButton在底部。 我添加了NSTableview and NSButton to an NSView called tempView。然后设置文档视图NSScrollView to tempView.

But problem i am having is my tableview does not expand properly i see the buttons alright but tablview does not expands properly and just show the last entries that fits in the table. As you can see in following image it displays last 4 rows of 20 rows. enter image description here] My code is as follow

-(void)setupView {
    _scrollView = [[NSScrollView alloc] init];
    [_scrollView setHasVerticalScroller:YES];
    [_scrollView setHasVerticalRuler:YES];
    [_scrollView setBorderType:NSBezelBorder];
    [_scrollView setBackgroundColor:[NSColor purpleColor]];
         _scrollView.autoresizingMask = NSViewHeightSizable;

    _tableView = [[NSTableView alloc] init];
    [_tableView setDataSource:self];
    [_tableView setHeaderView:nil];
    [_tableView addTableColumn:[[NSTableColumn alloc] initWithIdentifier:@"firstColumn"]];
    [_tableView setDelegate:self];
    [_tableView setColumnAutoresizingStyle:NSTableViewUniformColumnAutoresizingStyle];
    [_tableView setBackgroundColor:[NSColor greenColor]];

    NSButton* _button = [[NSButton alloc] initWithFrame:NSZeroRect];
    NSView* tempView = [[NSView alloc] initWithFrame:NSZeroRect];

    [tempView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [_scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [_button setTranslatesAutoresizingMaskIntoConstraints:NO];
    [_tableView setTranslatesAutoresizingMaskIntoConstraints:NO];

    [tempView addSubview:_button];
    [tempView addSubview:_tableView];

    [_scrollView setDocumentView:tempView];
    [self addSubview:_scrollView];


    NSString *const kViewContainerVertical = @"V:|[tempView]|";
    NSString *const kViewContainerHorizontal = @"H:|[tempView]|";

    NSDictionary *viewDictionary = NSDictionaryOfVariableBindings(tempView);

    NSArray *contraintOneView = [NSLayoutConstraint constraintsWithVisualFormat:kViewContainerVertical
                                                                        options:NSLayoutFormatAlignAllLeft
                                                                        metrics:nil
                                                                          views:viewDictionary];

    NSArray *constraintTwoView = [NSLayoutConstraint constraintsWithVisualFormat:kViewContainerHorizontal
                                                                         options:NSLayoutFormatAlignAllLeft
                                                                         metrics:nil
                                                                           views:viewDictionary];


    NSString *const kViewVertical = @"V:|[_tableView]-2-[_button]|";
    NSString *const kTextViewHorizontal = @"H:|[_tableView(_button)]-0-|";
    NSString *const kButtonHorizontal = @"H:|-0-[_button]-0-|";

    NSDictionary *dictionary = NSDictionaryOfVariableBindings(_tableView, _button);

    NSArray *contraintOne = [NSLayoutConstraint constraintsWithVisualFormat:kViewVertical
                                                                    options:NSLayoutFormatAlignAllLeft
                                                                    metrics:nil
                                                                      views:dictionary];

    NSArray *constraintTwo = [NSLayoutConstraint constraintsWithVisualFormat:kTextViewHorizontal
                                                                     options:NSLayoutFormatAlignAllLeft
                                                                     metrics:nil
                                                                       views:dictionary];

    NSArray *constraintThree = [NSLayoutConstraint constraintsWithVisualFormat:kButtonHorizontal
                                                                       options:NSLayoutFormatAlignAllLeft
                                                                       metrics:nil
                                                                         views:dictionary];
    [tempView addConstraints:contraintOne];
    [tempView addConstraints:constraintTwo];
    [tempView addConstraints:constraintThree];

    [_scrollView.contentView addConstraints:contraintOneView];
    [_scrollView.contentView addConstraints:constraintTwoView];


    NSString *const kScrollVertical = @"V:|-0-[_scrollView]-0-|";
    NSString *const kScrollHorizontal = @"H:|-0-[_scrollView]-0-|";

        NSDictionary *scrollDictionary = NSDictionaryOfVariableBindings(_scrollView);

    NSArray *contraintOneScroll = [NSLayoutConstraint constraintsWithVisualFormat:kScrollVertical
                                                                    options:NSLayoutFormatAlignAllLeft
                                                                    metrics:nil
                                                                      views:scrollDictionary];

    NSArray *constraintTwoScroll = [NSLayoutConstraint constraintsWithVisualFormat:kScrollHorizontal
                                                                     options:NSLayoutFormatAlignAllLeft
                                                                     metrics:nil
                                                                       views:scrollDictionary];

    [self addConstraints:contraintOneScroll];
    [self addConstraints:constraintTwoScroll];
}

我不明白这种行为的原因。

[_tableView constraintsAffectingLayoutForOrientation:NSLayoutConstraintOrientationVertical]

Returns

<__NSArrayI 0x608000101050>(
<NSContentSizeLayoutConstraint:0x6080000a2520 V:[NSButton:0x608000140c60'Button'(21)] Hug:250 CompressionResistance:750>,
<NSLayoutConstraint:0x608000082620 V:[NSButton:0x608000140c60'Button']-(0)-|   (Names: '|':NSView:0x608000121180 )>,
<NSLayoutConstraint:0x6080000825d0 V:[NSTableView:0x1004032f0]-(2)-[NSButton:0x608000140c60'Button']>,
<NSLayoutConstraint:0x608000082da0 V:|-(0)-[JSFlippedView:0x608000160cc0]   (Names: '|':NSView:0x610000120140 )>,
<NSAutoresizingMaskLayoutConstraint:0x608000081770 h=-&- v=-&- V:|-(1)-[NSClipView:0x100408c20]   (Names: '|':NSScrollView:0x6080001c0000 )>,
<NSLayoutConstraint:0x608000082490 V:[NSView:0x608000121180]-(0)-|   (Names: '|':NSClipView:0x100408c20 )>,
<NSLayoutConstraint:0x6080000828a0 V:[NSScrollView:0x6080001c0000]-(0)-|   (Names: '|':JSFlippedView:0x608000160cc0 )>,
<NSAutoresizingMaskLayoutConstraint:0x608000082fd0 h=-&- v=-&- V:[NSView:0x610000120140]-(0)-|   (Names: '|':NSThemeFrame:0x100403e30'ScrollTest-expand' )>,
<NSLayoutConstraint:0x608000082df0 V:[JSFlippedView:0x608000160cc0]-(0)-|   (Names: '|':NSView:0x610000120140 )>,
<NSLayoutConstraint:0x608000082440 V:|-(0)-[NSView:0x608000121180]   (Names: '|':NSClipView:0x100408c20 )>,
<NSAutoresizingMaskLayoutConstraint:0x608000081540 h=-&- v=-&- V:[NSClipView:0x100408c20]-(1)-|   (Names: '|':NSScrollView:0x6080001c0000 )>,
<NSLayoutConstraint:0x608000082850 V:|-(0)-[NSScrollView:0x6080001c0000]   (Names: '|':JSFlippedView:0x608000160cc0 )>,
<NSAutoresizingMaskLayoutConstraint:0x608000083200 h=-&- v=-&- V:|-(22)-[NSView:0x610000120140]   (Names: '|':NSThemeFrame:0x100403e30'ScrollTest-expand' )>,
<NSLayoutConstraint:0x608000082580 V:|-(0)-[NSTableView:0x1004032f0]   (Names: '|':NSView:0x608000121180 )>,
<NSLayoutConstraint:0x6000000806e0 'NSWindow-current-height' V:[NSThemeFrame:0x100403e30'ScrollTest-expand'(727@500)] priority:500>
)

and _tableView intrinsicContentSize gives {-1, -1}.


问题似乎是表格视图没有内在高度。因此,它不会“推动”文档视图的边界以使文档视图变大,因此它会滚动。

我注意到,如果我将表视图添加到 IB 中的窗口,然后告诉 IB 将整个窗口(或剪辑视图或表视图)重置为建议的约束,则表视图和剪辑视图之间不会添加任何约束。另外,表视图仍然有translatesAutoresizingMaskIntoConstraints已启用。这与滚动视图中的某些其他类型的视图不同。所以,我认为 IB 知道表视图不支持自动布局。

我相信直接在剪辑视图中的表视图(正如 IB 设置的那样)只是使用旧式机制来定位和调整自身大小。当表视图计算其大小(例如添加一行)时,它可能只是调用-setFrameSize:就其本身而言。剪辑视图通过观察来监视其帧NSViewFrameDidChangeNotification通知。这在您的情况下不起作用,因为自动布局基本上会忽略/撤消设置框架的尝试。

You may能够使用这个,但这会很冒险。你会离开表视图的translatesAutoresizingMaskIntoConstraints上,但这对您可以设置哪些约束而不引起冲突施加了限制。基本上,您不能设置对表视图强加位置或大小的约束,但您可以将其他视图“挂”在表视图之外,只要它们可以自由移动或调整大小,以便表视图可以自由地移动或调整大小。移动并调整大小。

首先,您的文档视图(tempView)应该是一个翻转视图,因为您将希望通过设置其框架将表视图定位在其顶部,然后它将通过设置其框架大小来调整自身大小,并且您希望它向下增长。

使用非零大小的框架初始化文档视图。起源并不重要。

使用原点位于 (0, 0) 的框架初始化表视图,并且其大小与文档视图相同。别忘了留下它translatesAutoresizingMaskIntoConstraints on.

不要将表视图的顶部、前导或尾部边缘约束到其父视图。不要限制其宽度以匹配按钮。我认为表视图及其超级视图和按钮之间的其他约束很好。所以,kViewVertical应该放弃第一个|。你应该摆脱kTextViewHorizontal完全。kButtonHorizontal很好。

设置表视图的autoresizingMask to NSViewWidthSizable。由于表视图以与其父视图的边界一致的框架开始,这将使表视图的左边缘和右边缘与父视图的左边缘和右边缘匹配。没有垂直分量autoresizingMask。基本上,您不希望更改超级视图的高度来尝试更改表视图的高度。表视图可以自由设置自己的框架高度。这将移动按钮,因为它被限制在表视图的底部,并且这将改变文档视图的高度,因为它的底部被限制在按钮的底部。

不要限制文档视图(tempView) 到其底部边缘的剪辑视图。这只是试图强制文档视图的大小contentSize的滚动视图。这肯定会阻止滚动(通过使滚动视图和窗口增大以显示整个文档视图)。相反,文档视图将改变大小,如上一段所述,剪辑视图将注意到这一点并相应地更新滚动视图。

我认为到了这一步,一切都会顺利进行。我怀疑当滚动视图足够大以显示按钮和整个表格视图时,它们将固定在滚动视图的底部而不是顶部,这会更自然。要解决这个问题,请使用NSClipView那是翻转的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Visual AutoLayout 在 NSScrollView 中布局多个视图 的相关文章

  • iPhone iOS 保存从 UIImageJPEGRepresentation() 获得的数据第二次失败:ImageIO: CGImageRead_mapData 'open' failed

    我的 UIImage 操作遇到了一个奇怪的问题 我正在进行保管箱同步 并且必须将我的图像存储为本地文件 为此 我使用以下命令保存它们UIImagePNGRepresentation image or UIImageJPEGRepresent
  • Objective-C:在哪里定义宏以便随处可用?

    我有一个 iOS 应用程序 它在许多视图控制器中使用相同的字符串 数字等 所以我认为最好在一个文件中定义这些常量并在所有视图控制器实现中使用它 优点是更改一个数字 我只需要做一次 而不是在所有视图控制器中都使用该数字 实际上 我的 h 文件
  • 最近打开的应用程序[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 有什么方法可以获取最近打开的应用程序 例如 4 个 的列表吗 如果是这样 怎么办 可可麦克 看看LaunchServices LSSh
  • 在 uilabel 中查找文本的位置 {x,y}

    我有一个来自服务器的字符串 我正在 UILabel multiligne 上显示它 在该字符串中 我正在识别一些特定的子字符串 我想在该子字符串上放置一个按钮 按钮将是 UILabel 的子视图 为此 我需要子字符串坐标 我经历过这个 但我
  • QFileSystemModel setRootPath

    我正在尝试创建一个 Qt 应用程序来显示文件夹 Mac OS 中的 Users 文件夹 的内容 这是代码 QFileSystemModel dirModel new QFileSystemModel dirModel gt setRootP
  • 您是否标记 UIView 或将它们保留为属性?

    这主要是一个风格问题 但自从我开始为 iPhone 编程以来 我一直很好奇其他人的想法是什么 当您的 iPhone 应用程序中有一个 UIView 并且需要在应用程序的其他位置访问它时 通常在视图控制器中的另一个函数中 您是否喜欢用整数标记
  • 最小的 iOS 蓝牙管理器示例

    我一直在构建一个最小的示例 用于使用 iOS 5 0 中的 BluetoothManager 私有框架来检测附近的蓝牙设备 使用此问题中找到的答案 寻找触手可及的通用蓝牙设备 https stackoverflow com question
  • NSSharingService 共享子菜单

    如何在 Mac 应用程序中添加共享子菜单 例如 Safari gt 文件 gt 共享 我戳了戳Apple 共享服务示例代码 http developer apple com library mac samplecode SharingSer
  • 一个好的8086模拟器[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 mac 有没有 8086 模拟器 如果是 哪个是最好的 除非您需要真正的原始 8086 带有自定义操作系统 否则您应该尝试 DosBox
  • 如何将 UILabel 的值绑定到实例变量?

    我是 mac objective c 的新手 我的问题是 我想知道是否可以将 UILabel 文本绑定到变量 而不必在值更改时手动设置文本 例如 在 Mac OS 上 当我打开新的 Finder 窗口并删除文件时 任务栏中的全局可用空间就会
  • 在 XCode 中链接静态 ObjC 库的过程

    我正在尝试链接到静态库 但不断收到链接器错误 我发现了一些发布示例的网站 但我无法看到我做错了什么 首先 我创建一个链接到我的库的项目 添加 gt 现有文件找到我的 xcodeproj 文件选择 将项目复制到目标组文件夹 选择我的宿主项目作
  • ios水平居中约束问题?

    I am having hard time in learning constraints auto layout in iOS I have used any width any height I have a storyboard sc
  • 从 robovm 项目创建 iOS 静态库(JNI 中的 BAD_ACCESS)

    我有大量的Java代码 只有计算函数 没有UI 我想在iOS中将其重用为静态库 我的方法是使用robovm http www robovm com并按照robovm论坛中两篇文章中描述的非官方方式创建静态库 1 基本方式 https gro
  • gem install mysql:无法构建 gem 本机扩展 (Mac Lion)

    我为 Mac OS X Lion 安装了 MySQL 5 5 27 来自 dmg 现在我尝试安装 mysql gem gem install mysql Building native extensions This could take
  • 在 iOS 应用程序中拨打电话

    我有一些代码尝试在应用程序中进行调用 但它似乎不起作用 UIApplication myApp UIApplication sharedApplication NSString theCall NSString stringWithForm
  • 如何按字母顺序对 UITableView 分区进行排序?

    我有一个包含 3 个类别的分段 UITableView 我正在使用这段代码 NSArray arrayOne NSArray arrayWithObjects one two three four nil NSDictionary dict
  • iOS 7 tabBar 横线,如何去掉?

    Apple 在 iOS 7 中的 tabBar 上添加了一条细线 该线应该在 tabBar 和 UI 之间起到阴影或淡入淡出的作用 由于我使用的是定制的 tabBar 这条线非常令人恼火 你如何删除它 请告诉我这是可能的 否则我需要重新设计
  • 从现有坐标地图套件中查找最近的位置

    我正在为拥有多家商店的客户开发 iPhone 应用程序 目标 C 我有数组中所有商店 20 的坐标 纬度 长 目前我正在考虑循环遍历商店坐标数组并获取从用户当前位置到商店位置的距离 然后将它们添加到数组中并按最小距离进行排序 这是正确的方法
  • 无法将项目添加到 NSMutableArray ivar

    我的目标是将字符串添加到数组中 并在我调用的方法中执行此操作 在这个方法中 我在数组中得到一个空值 但不知道为什么 我在课程开始时有这样的内容 NSMutableArray listOfEvents 以及我在每个事件上调用的方法 void
  • 使用强光混合模式时突出显示伪影

    我正在 iPhone 应用程序中使用顶部图像的 HardLight 混合模式混合两个图像 它看起来像这样 UIGraphicsBeginImageContext size sourceImage drawInRect rectangle b

随机推荐

  • 具有 URL 值的 HTML 标记属性的完整列表?

    除了以下属性之外 是否还有以 URL 作为值的 HTML 标记属性 href标签上的属性 a area src标签上的属性 img a
  • 将字符串转换为日期时间 vb.net

    我需要将字符串转换为日期格式 要求是如果选择当前月份 则日期应为 getdate 如果选择任何其他月份 则应选择该月的第一个月 输入的数据是 2010 年 1 月 2010 年 2 月 等 但它应该作为 01 01 10 或 02 01 1
  • JQuery - on()-方法/动态处理程序

    我有一份等候名单和一份参与者名单 管理员可以通过单击等待列表中用户名旁边的 div 将用户添加到参与者列表中 单击 div 将某人添加到参与者列表后 将调用 ajax 请求 gt 该请求会更新数据库中用户的状态 并且 如果 ajax 请求成
  • WebPack TypeError:无法读取未定义的属性“请求”

    我继承了一个现有的 Angular2 项目 当我跑步时NPM start我收到一个很长的错误 开头是 Html Webpack 插件 类型错误 无法读取未定义的属性 请求 完整的错误输出 http textuploader com d5n2
  • Android CoreLocation 标题

    我目前正在研究一种算法 需要准确估计移动设备的航向 对于iOS中的开发 我不必估计用户标题 因为框架已经提供了以下值trueHeading通过 CoreLocation 框架 所以我不必实现我自己的融合算法 这的美丽trueHeading是
  • Android 中的 Websocket 和 cookie

    我正在开发一个 Android 应用程序 我需要一个 Websockets 框架 该框架允许我在 Websocket 的第一个连接中发送 cookie 而不是在每条消息中 我试过了Autobahn and Java WebSocket但他们
  • facebook graph api 图片

    如何使用 graph api 检索朋友的图片 我已经设法使用这个来获取我朋友的个人资料图片 https graph facebook com user id 但是 我想获取我朋友发布的照片 我能够得到这个数据 link http www f
  • PHP 从 Javascript 加密流文件

    我正在开发一个用于大文件的文件上传器 从 HTML 脚本上传并使用 ArrayBuffer 和 Unit8Array 从 Javascript 按字节发送到 PHP PHP 脚本将流式传输文件并将其保存到文件夹中 这是我的 Javascri
  • 使用来自多个表的信息来记录交付的通用或特定 DAO?

    我正在创建一个 Web 应用程序 让用户使用 spring 和 hibernate 通过 GUI 存储和检索数据库中的信息 在创建 DAO 和服务层时我陷入了困境 我想创建一个可以添加新交付的方法 在我的交货表中我有产品编号 and 客户I
  • Prolific PL2303 串行端口至 250000bps

    我需要使用 c 以 250kbps 的速度运行我的 dev ttyUSB0 多产的 pl2303 USB RS232 转换器 我到处查看 每个人都说最接近的可达到的速度是 230400 bps http lxr linux no linux
  • 通用量化和统一,一个例子

    给出运行 monad 的以下签名ST runST forall s ST s a gt a 和功能 newVar a gt ST s MutVar s a readVar MutVar s a gt ST s a 那么Haskell编译器将
  • Facebook API for Android:如何获取有关用户好友的扩展信息?

    我正在开发小型 Android 应用程序 试图添加 Facebook 支持 主要问题 我只能获取有关用户朋友的基本信息 ID 姓名 应用程序权限列表 offline access仅用于测试 很快就会被删除 String sPermissio
  • 我如何使用 ruby​​ 迭代这个 json 文档?

    我有一个ruby代码块 如下 require elasticsearch require json search term big data city Hong Kong client Elasticsearch Client new lo
  • 使用 Maven 集成 Activiti Modeler

    如何将 Activiti Modeler 集成到自己的 Web 应用程序中并保留 Maven 建议的所有优点 问题是Maven中的Activiti Modeler是Activiti Explorer的一部分 网上有一些问题来自那些想要开发自
  • 如何在 Array.map 中获得正确的“this”?

    我假设有一些应用call or apply在这里 但我不确定如何实现它 http codepen io anon pen oXmmzo a foo bar things 1 2 3 showFooForEach function this
  • 如何在图中找到精确长度的路径

    我想在无向图中找到固定长度的路径 运行程序时给出 我正在使用我的图的邻接矩阵 我尝试使用一些算法 如 DFS 或 A 但它们只返回最短路径 节点无法再次访问 假设我的图有 9 个节点 最短路径是由 4 个节点构建的 我想要有额外的变量来 告
  • 使用Python从word文档中提取图像

    如何使用 python 从 Word 文档中提取图像 徽标并将其存储在文件夹中 以下代码将 docx 转换为 html 但不会从 html 中提取图像 任何指示 建议都会有很大帮助 profile path
  • 如何在创建广告帐户 Facebook 营销 api 时为 aduser 提供管理员访问权限

    我正在尝试使用以下代码通过 Facebook 营销和图形 API 在 Facebook 业务管理器中创建广告帐户 attachment array access token gt this gt accessToken name gt as
  • Seaborn 子图上的 GridSpec

    我目前有 2 个使用 seaborn 的子图 import matplotlib pyplot as plt import seaborn apionly as sns f ax1 ax2 plt subplots 2 sharex Tru
  • 使用 Visual AutoLayout 在 NSScrollView 中布局多个视图

    我需要显示内部垂直对齐的多个视图NSScrollView 我首先添加NSTableView and NSButton 我将它们垂直对齐NSTableView在顶部和NSButton在底部 我添加了NSTableview and NSButt