Проблема с обновлением ограничений размера на viewview в nswindow - PullRequest
0 голосов
/ 24 сентября 2019

Я пытался обновить ограничения для высоты и ширины 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) {
        ...
    }
}

Вот мои вопросы:

  1. , почему window.setContentSize(newContentSize) не добавляет ограничения на размер в contentView?
  2. Как правильно обновить ограничения размера contentView?
  3. Есть ли способ добавить ограничения, чтобы размер и положение contentView всегда соответствовали рамке окна?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...