首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift NSStackView :边做边学。我做错了什么?

Swift NSStackView :边做边学。我做错了什么?
EN

Stack Overflow用户
提问于 2014-09-06 13:57:54
回答 2查看 2.8K关注 0票数 3

如何让我的NSStackView一个接一个地展示我的观点?我的蓝色盒子正在我的红色盒子上画。

代码语言:javascript
复制
import Cocoa

class TestView : NSView{
  override init() {
    super.init(frame: NSRect(x: 0,y: 0,width: 100,height: 100))
  }

  required init(coder: NSCoder) {
      fatalError("init(coder:) has not been implemented")
  }

  override func drawRect(dirtyRect: NSRect) {
    super.drawRect(dirtyRect)
    NSColor.redColor().setFill()
    NSBezierPath.fillRect(self.bounds)
  }
}

class TestView2 : NSView{
  override init() {
    super.init(frame: NSRect(x: 0,y: 0,width: 100,height: 100))
  }

  required init(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  override func drawRect(dirtyRect: NSRect) {
    super.drawRect(dirtyRect)
    NSColor.blueColor().setFill()
    NSBezierPath.fillRect(self.bounds)
  }
}

class AppDelegate: NSObject, NSApplicationDelegate {

  @IBOutlet weak var window: NSWindow!

  @IBOutlet weak var searchFacetItems: SearchFacetSelectorView!
  @IBOutlet weak var searchFacetHeader: SearchFacetSelectorHeader!
  var content : NSStackView!
  let testView = TestView()
  let testView2 = TestView2()

  func applicationDidFinishLaunching(aNotification: NSNotification?) {
    // Insert code here to initialize your application
    content = NSStackView(frame: window.contentView.bounds)
        content.orientation = NSUserInterfaceLayoutOrientation.Vertical
        content.alignment = NSLayoutAttribute.CenterX

    content.addView(testView, inGravity: NSStackViewGravity.Center)
    content.addView(testView2, inGravity: NSStackViewGravity.Center)


    window.contentView = content!
  }

  func applicationWillTerminate(aNotification: NSNotification?) {
    // Insert code here to tear down your application
  }


}

通过阅读学习

这不是appkit,但也许我能找到一些线索:如何以编程方式使用UIVIEWS与自动布局

自动布局指南

EN

回答 2

Stack Overflow用户

发布于 2014-09-07 01:54:08

您应该能够通过调整NSRect坐标来做到这一点。目前,两个NSRects都使用相同的精确坐标:

代码语言:javascript
复制
NSRect(x: 0, y: 0, width: 100, height: 100) 

如果您想让NSView水平地(在右边)位于另一个的旁边:

代码语言:javascript
复制
NSRect(0, 0, 100, 100)    // TestView1
NSRect(100, 0, 100, 100)  // TestView2

垂直下方:

代码语言:javascript
复制
NSRect(0, 0, 100, 100)    // TestView1
NSRect(0, -100, 100, 100) // TestView2
票数 0
EN

Stack Overflow用户

发布于 2015-05-20 18:49:21

视图没有描述其首选大小的任何约束,例如intrinsicContentSize或显式约束。而且,NSStackView只添加了将其叠加的视图相对于彼此放置的约束,而不是用于调整单个视图大小的约束。

如果没有它们,它们在堆叠轴中的大小就会变得模糊,并且通常会将所有的调整大小提供给一个视图。在您的示例中,我猜想蓝色框不是绘制在红色框的顶部,而是红色框具有0的高度(并且是在蓝色视图之后堆叠的)。

NSButton添加到堆栈视图中没有这个问题,因为它们确实有一个已定义的intrinsicContentSize

取决于您的视图是什么--它们是否具有内部大小,或者是否由内部子视图的约束来定义--您将要么重写intrinsicContentSize,要么添加那些最终定义其高度的约束。

编辑:哦,确保在您要添加到堆栈视图的视图上将translatesAutoresizingMaskIntoConstraints设置为false (它看起来不像来自示例代码)。如果没有,您很快就会遇到麻烦,因为自动调整约束试图定位视图,并且与堆栈视图添加的约束冲突。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25701039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档