Как изменить размер текста, когда приложение выходит на весь экран

#swift #macos #swiftui #textfield #autoresize

Вопрос:

Я создал метку (текстовое поле) в swift, размер которой изменяется, когда мое приложение macOS выходит на полный экран. Но текст внутри текстового поля по-прежнему имеет тот же размер.Это не изменение размера. Как изменить размер текста в соответствии с размером экрана или размером текстового поля? Пожалуйста, помогите мне с этим.

Комментарии:

1. Пожалуйста, ознакомьтесь с рекомендациями по отправке вопросов о переполнении стека. Этот вопрос содержит нулевой код, мало информации, практически не требует усилий и представляет собой вопрос с чрезвычайно очевидным ответом.

Ответ №1:

Чтобы обнаружить изменения в полноэкранном режиме, добавьте наблюдателей в контроллер просмотра viewDidLoad :

 NotificationCenter.default.addObserver(self, selector: #selector(didEnterFullscreen), name: NSWindow.didEnterFullScreenNotification, object: self.view.window)
NotificationCenter.default.addObserver(self, selector: #selector(didExitFullscreen), name: NSWindow.didExitFullScreenNotification, object: self.view.window)
 

Затем установите свойство текстового поля font в didEnterFullscreen и didExitFullscreen .

Однако гораздо более универсальным решением было бы обновлять шрифт всякий раз, когда размер текстового поля меняется:

 class AutoResizableTextField: NSTextField {
    
    override var frame: NSRect {
        didSet {
            // Find the max font size that does not cause the text to exceed our frame
            var font = self.font?.withSize(1) ?? NSFont.systemFont(ofSize: 1)
            var string = attributedStringValue
            // Increase font size until the text just barely fits
            while true {
                font = font.withSize(font.pointSize   1)
                // Calculate the size of the text with this font
                let next = NSMutableAttributedString(attributedString: string)
                next.addAttribute(.font, value: font, range: NSRange(location: 0, length: string.length))
                var size = next.size()
                // Pad the size a bit to prevent clipping
                size.width  = 6
                size.height  = 6
                if size.width > frame.width || size.height > frame.height { break }
                string = next
            }
            // Set the font
            attributedStringValue = string
        }
    }
}
 

Просто убедитесь, что установлено textField.autoresizingMask = [.width, .height] значение, позволяющее изменять размер поля при каждом изменении размера окна.