相當多的關于以編程方式實作滾動視圖的帖子,但我還沒有找到適合這種情況的解決方案......在這里我將子視圖添加到檔案視圖(所有內容都使用布局錨點布置),除了滾動。
我認為這里的問題是 AppKit 將示例中的約束解釋為沒有任何可滾動的內容,但我不知道為什么......
import Cocoa
class ViewController: NSViewController {
var scrollView = NSScrollView()
var contentView = NSClipView()
var documentView = ParentView()
var generateButton = NSButton()
@objc func generate(_ sender: NSObject) {
let child = ChildView()
child.translatesAutoresizingMaskIntoConstraints = false
documentView.addSubview(child)
documentView.setupChildViewLayout(sv: child)
}
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(generateButton)
view.addSubview(scrollView)
setupLayout()
}
func setupLayout() {
scrollView.contentView = contentView
scrollView.documentView = documentView
scrollView.borderType = .lineBorder
scrollView.hasHorizontalScroller = true
scrollView.hasVerticalScroller = true
scrollView.translatesAutoresizingMaskIntoConstraints = false
contentView.translatesAutoresizingMaskIntoConstraints = false
documentView.translatesAutoresizingMaskIntoConstraints = false
view.addConstraints([
scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 10),
scrollView.trailingAnchor.constraint(lessThanOrEqualTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -150),
scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 80),
scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -100)
])
NSLayoutConstraint.activate([
scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 10),
scrollView.trailingAnchor.constraint(lessThanOrEqualTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -150),
scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 80),
scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -100)
])
scrollView.addConstraints([
contentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
contentView.trailingAnchor.constraint(greaterThanOrEqualTo: scrollView.trailingAnchor),
contentView.topAnchor.constraint(equalTo: scrollView.topAnchor),
contentView.bottomAnchor.constraint(greaterThanOrEqualTo: scrollView.bottomAnchor)
])
NSLayoutConstraint.activate([
contentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
contentView.trailingAnchor.constraint(greaterThanOrEqualTo: scrollView.trailingAnchor),
contentView.topAnchor.constraint(equalTo: scrollView.topAnchor),
contentView.bottomAnchor.constraint(greaterThanOrEqualTo: scrollView.bottomAnchor)
])
scrollView.addConstraints([
documentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
documentView.trailingAnchor.constraint(greaterThanOrEqualTo: scrollView.trailingAnchor),
documentView.topAnchor.constraint(equalTo: scrollView.topAnchor),
documentView.bottomAnchor.constraint(greaterThanOrEqualTo: scrollView.bottomAnchor)
])
NSLayoutConstraint.activate([
documentView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor),
documentView.trailingAnchor.constraint(greaterThanOrEqualTo: scrollView.trailingAnchor),
documentView.topAnchor.constraint(equalTo: scrollView.topAnchor),
documentView.bottomAnchor.constraint(greaterThanOrEqualTo: scrollView.bottomAnchor)
])
// Setup anchor constraints for the button
setupGenerateButton()
generateButton.translatesAutoresizingMaskIntoConstraints = false
view.addConstraints([
generateButton.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 10),
generateButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -30),
generateButton.heightAnchor.constraint(equalToConstant: 30),
generateButton.widthAnchor.constraint(equalToConstant: 200)
])
NSLayoutConstraint.activate([
generateButton.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 10),
generateButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -30),
generateButton.heightAnchor.constraint(equalToConstant: 30),
generateButton.widthAnchor.constraint(equalToConstant: 200)
])
}
func setupGenerateButton() {
generateButton.attributedTitle = NSMutableAttributedString(string: "GenerateChildView", attributes: [NSAttributedString.Key.strokeColor: (NSColor.white), NSAttributedString.Key.font: NSFont.systemFont(ofSize: (NSFont.systemFontSize))])
generateButton.wantsLayer = true
generateButton.bezelColor = NSColor(red: 0.2, green: 0.2, blue: 0.6, alpha: 1.0)
generateButton.action = #selector(self.generate(_:))
}
}
class ParentView: NSView {
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
}
func setupChildViewLayout(sv: ChildView) {
if (self.subviews.count < 2) {
self.addConstraints([
sv.leadingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leadingAnchor),
sv.topAnchor.constraint(equalTo: self.topAnchor)
])
NSLayoutConstraint.activate([
sv.leadingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leadingAnchor),
sv.topAnchor.constraint(equalTo: self.topAnchor)
])
}
else {
let c = self.subviews.count - 2
let lastView = self.subviews[c]
self.addConstraints([
sv.leadingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leadingAnchor),
sv.topAnchor.constraint(equalTo: lastView.bottomAnchor)
])
NSLayoutConstraint.activate([
sv.leadingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leadingAnchor),
sv.topAnchor.constraint(equalTo: lastView.bottomAnchor)
])
}
}
}
class ChildView: NSView {
override var intrinsicContentSize: NSSize {
return CGSize(width: 650, height: 200)
}
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
NSColor.gray.set()
self.bounds.frame()
}
}
uj5u.com熱心網友回復:
您仍在將內容視圖和檔案視圖固定到滾動視圖。只在滾動視圖的外部和檔案視圖的內部添加約束。不要在內容視圖、檔案視圖和滾動視圖之間添加約束。在父視圖及其子視圖之間添加約束,以便子視圖適合父視圖。
class ViewController: NSViewController {
var scrollView = NSScrollView()
var documentView = ParentView()
var generateButton = NSButton()
@objc func generate(_ sender: NSObject) {
let child = ChildView()
child.translatesAutoresizingMaskIntoConstraints = false
documentView.addSubview(child)
documentView.setupChildViewLayout(sv: child)
}
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(generateButton)
view.addSubview(scrollView)
setupLayout()
}
func setupLayout() {
scrollView.documentView = documentView
scrollView.borderType = .lineBorder
scrollView.hasHorizontalScroller = true
scrollView.hasVerticalScroller = true
scrollView.translatesAutoresizingMaskIntoConstraints = false
documentView.translatesAutoresizingMaskIntoConstraints = false
view.addConstraints([
scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 10),
scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -150),
scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 80),
scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -100)
])
// Setup anchor constraints for the button
setupGenerateButton()
generateButton.translatesAutoresizingMaskIntoConstraints = false
view.addConstraints([
generateButton.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 10),
generateButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -30),
generateButton.heightAnchor.constraint(equalToConstant: 30),
generateButton.widthAnchor.constraint(equalToConstant: 200)
])
}
func setupGenerateButton() {
generateButton.attributedTitle = NSMutableAttributedString(string: "GenerateChildView", attributes: [NSAttributedString.Key.strokeColor: (NSColor.white), NSAttributedString.Key.font: NSFont.systemFont(ofSize: (NSFont.systemFontSize))])
generateButton.wantsLayer = true
generateButton.bezelColor = NSColor(red: 0.2, green: 0.2, blue: 0.6, alpha: 1.0)
generateButton.action = #selector(self.generate(_:))
}
}
class ParentView: NSView {
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
}
func setupChildViewLayout(sv: ChildView) {
if (self.subviews.count == 1) {
self.addConstraints([
sv.leadingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leadingAnchor),
sv.trailingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.trailingAnchor),
sv.topAnchor.constraint(equalTo: self.topAnchor),
sv.bottomAnchor.constraint(equalTo: self.bottomAnchor)
])
}
else {
let c = self.subviews.count - 2
let lastView = self.subviews[c]
self.addConstraints([
sv.leadingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leadingAnchor),
sv.topAnchor.constraint(equalTo: lastView.bottomAnchor)
])
let bottomConstraints = self.constraints.filter {
$0.firstAttribute == NSLayoutConstraint.Attribute.bottom
}
self.removeConstraints(bottomConstraints)
self.addConstraints([
sv.bottomAnchor.constraint(equalTo: self.bottomAnchor)
])
}
}
}
class ChildView: NSView {
override var intrinsicContentSize: NSSize {
return CGSize(width: 650, height: 200)
}
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
NSColor.gray.set()
self.bounds.frame()
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/428595.html
標籤:迅速 可可 nsscrollview nslayoutanchor
上一篇:NSCollectionViewAttributes未與自定義NSFlowLayout子類正確應用
下一篇:在shuffle包中添加文本
