पर अजीब स्क्रॉलिंग मेरे पास NSTextField
है कि जब भी इसकी सामग्री बदल जाती है तो मैं स्वचालित मानदंडों को स्वचालित रूप से आकार बदलने का प्रयास करता हूं।NSTextField
कभी कभी, जब टाइपिंग सामग्री (नीचे या) ऊपर जा रहा पाठ क्षेत्र के दृश्य भाग शुरू के रूप में निम्नलिखित gif में दिखाया गया है शुरू:
तो मैं NSTextField
के अंदर क्लिक करें, सामग्री सही स्थिति में फिर से प्रकट होता है।
XCode में दृश्य डिबगर ऊपर फायरिंग मैंने देखा कि जब इस मामले हो, NSTextField
के निजी subview: _NSKeyboardFocusClipView
एक frame
जिसका Y
समन्वय एक नकारात्मक संख्या है है।
मुझे यकीन नहीं है कि इसका कारण क्या है।
यहाँ मेरी textfield व्यवहार का आकार परिवर्तन है:
import Cocoa
struct TextFieldResizingBehavior {
let maxHeight: CGFloat = 100000.0
let maxWidthPadding: CGFloat = 10
let minWidth: CGFloat = 50
let maxWidth: CGFloat = 250
func resize(_ textField: NSTextField) {
let originalFrame = textField.frame
var textMaxWidth = textField.attributedStringValue.size().width
textMaxWidth = textMaxWidth > maxWidth ? maxWidth : textMaxWidth
textMaxWidth += maxWidthPadding
var constraintBounds: NSRect = textField.frame
constraintBounds.size.width = textMaxWidth
constraintBounds.size.height = maxHeight
var naturalSize = textField.cell!.cellSize(forBounds: constraintBounds)
// ensure minimun size of text field
naturalSize.width = naturalSize.width < minWidth ? minWidth : naturalSize.width
if originalFrame.height != naturalSize.height {
// correct the origin in order the textField to grow down.
let yOffset: CGFloat = naturalSize.height - originalFrame.height
let newOrigin = NSPoint(
x: originalFrame.origin.x,
y: originalFrame.origin.y - yOffset
)
textField.setFrameOrigin(newOrigin)
}
textField.setFrameSize(naturalSize)
Swift.print(
"\n\n>>>>>> text field resized " +
"\nnaturalSize=\(naturalSize)" +
"\noriginalFrame=\(originalFrame)-\(originalFrame.center)" +
"\nnewFrame=\(textField.frame)-\(textField.frame.center)"
)
}
}
जो NSTextFieldDelegate
पद्धति पर शुरू हो जाती है:
extension CanvasViewController: NSTextFieldDelegate {
override func controlTextDidChange(_ obj: Notification) {
if let textField = obj.object as? NSTextField {
textFieldResizingBehavior.resize(textField)
}
}
और अंत में मेरे पाठ फ़ील्ड की तरह ViewController में घोषित किया जाता है:
lazy var textField: NSTextField = {
let textField = NSTextField()
textField.isHidden = true
textField.isEditable = false
textField.allowsEditingTextAttributes = true
return textField
}()
पूर्ण कोड में: https://github.com/fespinoza/linked-ideas-osx
यह कोड परियोजना में नहीं है। मुझे नहीं पता कि इसके साथ क्या करने के लिए कुछ भी है लेकिन 'बनें फर्स्ट रेस्पॉन्डर' को कॉल न करें। प्रलेखन कहता है: "एनएसविंडो मेक फर्स्ट रेस्पॉन्डर (_ :) विधि, इस विधि को नहीं, ऑब्जेक्ट को पहला उत्तरदाता बनाने के लिए उपयोग करें। इस विधि को सीधे कभी भी नकारें।" – Willeke
कोड पीआर के साथ एक शाखा में है। मैं जांच करूँगा कि आप क्या कह रहे हैं हालांकि – fespinozacast
क्या यह वास्तव में दोनों दिशाओं में बढ़ने में सक्षम होने की आवश्यकता है? मुझे लगता है कि अगर इसे ऊंचाई समायोजित करने की जरूरत है तो इसे हल करना आसान होगा। – catlan