#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]
значение, позволяющее изменять размер поля при каждом изменении размера окна.