Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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
Swift NSPOVER自动布局问题中的NSCRLLVIEW_Swift_Macos_Cocoa - Fatal编程技术网

Swift NSPOVER自动布局问题中的NSCRLLVIEW

Swift NSPOVER自动布局问题中的NSCRLLVIEW,swift,macos,cocoa,Swift,Macos,Cocoa,我有一个包含NSViewController和包含NSScrollView的NSPover Popover高度必须是NSScrollView内容或当前窗口的高度。一旦它到达窗口的边界,它就会滚动 使用Snapkit 我已将NSScrollView添加到控制器: view.addSubviewscrollView scrollView.snp.makeConstraints{make in make.edges.equalToview make.height.equalTomainView.con

我有一个包含NSViewController和包含NSScrollView的NSPover

Popover高度必须是NSScrollView内容或当前窗口的高度。一旦它到达窗口的边界,它就会滚动

使用Snapkit

我已将NSScrollView添加到控制器:

view.addSubviewscrollView scrollView.snp.makeConstraints{make in make.edges.equalToview make.height.equalTomainView.content.snp.height } 在内容大于窗口之前,这种方式可以正常工作,然后发生的情况是,NSScrollView不会滚动到内容的顶部,因为视图已将自身向上推到边界之外

我已经删除了高度约束,并在viewDidLayout中尝试更新高度,但不起作用


如果需要更多的代码示例,请告诉我。

最终找到了问题的根源,并找到了合理的解决方案

我正在开发的应用程序有几个在不同阶段需要的popover,为了确保它们按要求关闭,我创建了一个管理每个popover的服务,下面是一个示例:

类PopoverService:NSObject{ 枚举PopoverType{ 案例订阅,编辑 } //================================================================================ //标记:-属性 //================================================================================ 私有var dismissingPopover=false 私有延迟变量currentPopover:nspoover={ 让popover=NSPopover popover.delegate=self 返回府绸 } 私有变量nextPopoverType:PopoverType? 私有变量currentView:NSView! 公共静态变量委托:PopoverServiceDelegate? //================================================================================ //马克:单身汉 //================================================================================ 静态let shared=popooverservice //================================================================================ //马克:助手 //================================================================================ 公共静态函数增加高度\高度:CGFloat{ shared.currentPopover.contentSize.height=高度 } 公共静态函数为显示类型\类型:PopoverType->Bool{ 开关类型{ 案例.编辑: 返回shared.currentPopover.contentViewController是EditEntryController 案例.语言: return shared.currentPopover.contentViewController是CodeTypeController 违约: 返回错误 } } 公共静态函数displayPopovertype:PopoverType,fromView视图:NSView{ shared.nextPopoverType=类型 shared.currentView=视图 开关类型{ 案例.认购: 显示SubscriptionPoOverfromView //创建用于显示弹出框的函数 } } 静态函数dismisspopoverclear:Bool=true{ 如果即将到来{ shared.nextPopoverType=nil } shared.currentPopover.performClosenil 如果shared.currentPopover.contentViewController==nil{ shared.dismissingPopover=false;返回 } } } 扩展PopoverService:NSPopoverDelegate{ func popoverDidClose\通知:通知{ currentPopover.contentViewController=nil dismissingPopover=false guard let nextPopoverType=nextPopoverType else{return} PopoverService.displayPopover 类型:NEXTPOVERTYPE, fromView:currentView, 条目:currentEntry } } 要更新当前的popover,有一个函数increaseHeight,它接受和CGFloat,并将更新当前的popover高度

在NSViewController中,覆盖viewDidLayout:

覆盖功能视图布局{ super.viewDidLayout 让windowFrameHeight=view.window?.frame.size.height??0 让contentHeight=scrollView.content.frame.height 让调整=内容高度>窗框高度?窗框高度:内容高度 PopoverService.increaseHeightadjustment 如果contentHeight>0&&firstLayout{ 如果让documentView=scrollView.documentView{ documentView.ScrollnPointX:0,y:documentView.bounds.size.height } } } 需要将scrollView强制置于顶部,以便在ViewDidDisplay中设置变量firstLayout为true