在水平可滚动视图中并排显示一堆NSViewControllers的最佳方法是什么?
每个“行”必须像分割视图一样自行调整大小。
我使用拆分视图和滚动视图测试了一些想法,但无法获得良好的起点。
谢谢你的一脚。 PS。
更新 这就是我所拥有的:
我将一个scrollview添加到我的主视图(ColoumnMasterViewController)边框到边框。我将第二个ViewController添加到故事板并将它们命名为“coloumn_view_controller”
在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
}
}
但滚动不可用。
那么,如何在滚动视图中创建一个比当前视口大的视图?我想如果我解决了这个问题,我就能解决其他的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)
}
但是我的autoLayout()效果不好。你将如何实现contentView将在superview的顶部,底部,尾部和前导上固定的autoLayout?
答案 0 :(得分:0)
制作一个"超级视图控制器"
制作"超级视图控制器"显示每个子UIViewController
"超级视图控制器"应该是一个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子类替换视图。