Я пытался обновить ограничения для высоты и ширины window.contentView
* contentView
- это простой NSView, добавленный в окно с помощью
window.contentViewController = NSViewController(nibName: "MainWindowContent", bundle: Bundle.main)
соответствующего перафайл содержит только NSView, ничего больше.
без 2-х строк для установки ограничений по ширине и высоте, contentView не появится, Xcode сообщает о неоднозначном положении и размере для NSView, но приложение не будет аварийно завершать работу..
с этими 2 строками Xcode сообщает только о неоднозначной позиции, и будет отображаться contentView.
этот класс является NSViewControllerPresentationAnimator, который может использоваться в настоящем NSView (_:, animator:)метод представления подпредставления, а затем используемый при отклонении того же подпредставления родителем.
Проблема заключается во 2-й раз, когда NSAnimationContext.runAnimationGroup в animatePresentation (of:, from:) проходит, но до того, какобработчик завершения, приложение будет зависать со следующей ошибкой:
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
Как альтернатива, у меня естьпопытался использовать autoresizingMask и переводит AutoresizingMaskIntoConstraints.Но согласно официальной документации: «Если ваше представление имеет гибкие ограничения, которые требуют динамической настройки, установите для этого свойства значение false и примените ограничения самостоятельно».Поэтому я не думаю, что этот метод применим в этой ситуации.
Поскольку подпредставление contentView будет время от времени меняться, contenViewController в основном работает как координатор для переключения подпредставлений.В любой момент времени у contentViewController есть только один дочерний элемент.
import Cocoa
class ReplaceChildrenAnimator: NSObject, NSViewControllerPresentationAnimator {
func animatePresentation(of viewController: NSViewController, from fromViewController: NSViewController) {
print("ReplaceChildrenAnimator animatePresentation")
guard let window = fromViewController.view.window else {
return
}
let newOrigin = CGPoint(
x: window.frame.midX - viewController.view.frame.width / 2.0,
y: window.frame.midY - viewController.view.frame.height / 2.0
)
let newContentSize = viewController.view.frame.size
let newFrame = CGRect(origin: newOrigin, size: newContentSize)
viewController.view.alphaValue = 0.0
NSAnimationContext.runAnimationGroup({ _ in
if fromViewController.children.count >= 1 {
fromViewController.children[0].view.animator().alphaValue = 0.0
// 1. remove all children of fromViewController (window.contentViewController)
fromViewController.children.removeAll()
}
// 2. adjust window contentSize to be the same as viewController.view
window.animator().setFrame(newFrame, display: true)
if let existingConstraints = window.contentView?.constraints {
window.contentView?.removeConstraints(existingConstraints)
}
window.setContentSize(newContentSize)
window.contentView?.widthAnchor.constraint(equalToConstant: newContentSize.width).isActive = true
window.contentView?.heightAnchor.constraint(equalToConstant: newContentSize.height).isActive = true
print("update of size constraints on window.contentView successful")
}, completionHandler: {
// 3. add viewController as children of fromViewController (window.contentViewController)
fromViewController.add(childController: viewController)
fromViewController.view.animator().alphaValue = 1.0
viewController.view.animator().alphaValue = 1.0
})
}
func animateDismissal(of viewController: NSViewController, from fromViewController: NSViewController) {
...
}
}
Вот мои вопросы:
- , почему
window.setContentSize(newContentSize)
не добавляет ограничения на размер в contentView? - Как правильно обновить ограничения размера contentView?
- Есть ли способ добавить ограничения, чтобы размер и положение contentView всегда соответствовали рамке окна?