在Swift中显示水平的NSViewControllers数组

时间:2015-06-02 22:20:52

标签: macos swift cocoa

在水平可滚动视图中并排显示一堆NSViewControllers的最佳方法是什么?

每个“行”必须像分割视图一样自行调整大小。

我使用拆分视图和滚动视图测试了一些想法,但无法获得良好的起点。

谢谢你的一脚。 PS。

更新 这就是我所拥有的:

我将一个scrollview添加到我的主视图(ColoumnMasterViewController)边框到边框。我将第二个ViewController添加到故事板并将它们命名为“coloumn_view_controller”

enter image description here

在ColoumnMasterViewController中,我添加了coloumn_view_controller.view几次:

class ColoumnMasterViewController: NSViewController {

@IBOutlet weak var scrollView: NSScrollView!

override func viewDidLoad() {
    for i in 1...10 {
        let vc: NSViewController = self.storyboard?.instantiateControllerWithIdentifier("coloumn_view_controller") as! NSViewController

        vc.view.setFrameOrigin(NSPoint(x: (130 * i), y: (i * 10)))
        println("set to \(vc.view.bounds)")

        scrollView.addSubview(vc.view)
    }
    scrollView.needsLayout = true
}
}

但滚动不可用。

enter image description here

那么,如何在滚动视图中创建一个比当前视口大的视图?我想如果我解决了这个问题,我就能解决其他的splitview问题。

非常感谢!

更新2 最后我到目前为止得到了它:

@IBOutlet weak var scrollingView: NSScrollView!

override func viewDidLoad() {

    var contentView = NSView(frame: NSRect(x: 0, y: 0, width: 3000, height: self.view.frame.height))

    contentView.wantsLayer = true
    contentView.layer?.backgroundColor =  NSColor.redColor().CGColor

    for i in 0...10 {
        let vc: NSViewController = self.storyboard?.instantiateControllerWithIdentifier("coloumn_view_controller") as! NSViewController
        vc.view.setFrameOrigin(NSPoint(x: (i * 130), y: 0))

        vc.view.setFrameSize(NSSize(width: 130, height: self.view.frame.height))
        contentView.addSubview(vc.view)
    }

    scrollingView.documentView = contentView

    autoLayout(contentView)
}

enter image description here

但是我的autoLayout()效果不好。你将如何实现contentView将在superview的顶部,底部,尾部和前导上固定的autoLayout?

3 个答案:

答案 0 :(得分:0)

  1. 制作一个"超级视图控制器"

  2. 制作"超级视图控制器"显示每个子UIViewController

  3. 的view属性

    "超级视图控制器"应该是一个UITableViewViewController实例来帮助您滚动和调整行的大小

    问题相当广泛,因此不清楚您需要多少指导,不要对请求澄清发表评论。

答案 1 :(得分:0)

您可以使用拆分视图控制器。你可以拥有任意数量的分频器。

在OSX的最新版本中,视图控制器可以托管其他视图控制器的内容。

答案 2 :(得分:0)

最后,我找到了一个解决方案并将其粘贴在一个演示项目中:https://github.com/petershaw/DynamicScrollViewExample

Trick是添加一个NSView并将其设置到documentView中,而不是使用autolayout正确管理documentView:

override func viewDidLoad() {
    contentView = NSView(frame: NSRect(x: 0, y: 0, width: 3000, height: self.view.frame.height))

    scrollingView.documentView = contentView

    autoLayout(contentView!)
}

自动布局:

func autoLayout(contentView: NSView){
    let topPinContraints = NSLayoutConstraint(
        item: contentView
        , attribute: NSLayoutAttribute.Top
        , relatedBy: .Equal
        , toItem: contentView.superview
        , attribute: NSLayoutAttribute.Top
        , multiplier: 1.0
        , constant: 0
    )
    let bottomPinContraints = NSLayoutConstraint(
          item: contentView
        , attribute: NSLayoutAttribute.Bottom
        , relatedBy: .Equal
        , toItem: contentView.superview
        , attribute: NSLayoutAttribute.Bottom
        , multiplier: 1.0
        , constant: 0
    )

    println("heightContraints \(contentView.superview!.frame.height)")
    let heightContraints = NSLayoutConstraint(
        item: contentView
        , attribute: NSLayoutAttribute.Height
        , relatedBy: .Equal
        , toItem: contentView.superview!
        , attribute: NSLayoutAttribute.Height
        , multiplier: 1.0
        , constant: 0
    )
    println("widthtContraints \(contentView.superview!.frame.width)")
    let calculatedWith: CGFloat = (CGFloat) (contentView.subviews.count * 130)
    widthtContraints = NSLayoutConstraint(
        item: contentView
        , attribute: NSLayoutAttribute.Width
        , relatedBy: .Equal
        , toItem: nil
        , attribute: NSLayoutAttribute.Width
        , multiplier: 1.0
        , constant: 0
    )
    widthtContraints!.constant = calculatedWith

    NSLayoutConstraint.activateConstraints([
          topPinContraints
         , bottomPinContraints
         , heightContraints
         , widthtContraints!
    ])

    contentView.translatesAutoresizingMaskIntoConstraints = false
    contentView.needsLayout = true

}

并且在调整内容大小后进行布局更新:

func updateWidth(){
    let calculatedWith: CGFloat = (CGFloat) (contentView!.subviews.count * 130)
    if (widthtContraints != nil) {
        widthtContraints!.constant = calculatedWith
    }
}

但我不知道这是否是一个好的解决方案?欢迎评论。现在,我可以用NSSplitView子类替换视图。