gpt4 book ai didi

macos - 自动布局:设置约束后无法调整窗口大小

转载 作者:行者123 更新时间:2023-12-03 17:10:44 24 4
gpt4 key购买 nike

我需要一些有关以编程方式设置自动布局的帮助。我有一个 View ,我将其设置为另一个由 Storyboard管理的 View 。

var content = NSView(frame: NSRect(x: 0, y: 0, width: 3000, height: self.view.frame.height))
[...]
scrollingView.documentView = content

然后我添加了 View 始终从上到下的引脚约束:

    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
)
let heightContraints = NSLayoutConstraint(
item: contentView
, attribute: NSLayoutAttribute.Height
, relatedBy: .Equal
, toItem: contentView.superview
, attribute: NSLayoutAttribute.Height
, multiplier: 1.0
, constant: 0
)

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

contentView.needsLayout = true

在 NSLayoutConstraint.activateConstraints 之后, View 在 super View 中从上到下填充,窗口的高度不再可调整大小。我可以调整它的宽度,但高度现在是固定的。

如何添加顶部和底部图钉而不失去调整大小的可能性?

非常感谢

附注

最佳答案

最后我得到了一些适合我的代码。但这是正确的解决方案吗?让我发布我的整个 ViewController 来向您展示我的经验。也许你可以发表你的评论,我可以做得更好。

import Foundation
import Cocoa

class ColoumnMasterViewController: NSViewController {

@IBOutlet weak var scrollingView: NSScrollView!

var position = 0
var contentView: NSView?
var widthtContraints: NSLayoutConstraint?

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

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

add()
var timer = NSTimer.scheduledTimerWithTimeInterval(1.6, target: self, selector: Selector("add"), userInfo: nil, repeats: true)

scrollingView.documentView = contentView

autoLayout(contentView!)
}

func add(){
println("add view on position \(position)")
let vc: NSViewController = self.storyboard?.instantiateControllerWithIdentifier("coloumn_view_controller") as! NSViewController
vc.view.setFrameOrigin(NSPoint(x: (position++ * 130), y: 0))
vc.view.setFrameSize(NSSize(width: 130, height: self.view.frame.height))
contentView!.addSubview(vc.view)

updateWidth()
}

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
}
}

}

万分感谢,

ps

关于macos - 自动布局:设置约束后无法调整窗口大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30632923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com