2017-05-10 21 views
11

पर अजीब स्क्रॉलिंग मेरे पास NSTextField है कि जब भी इसकी सामग्री बदल जाती है तो मैं स्वचालित मानदंडों को स्वचालित रूप से आकार बदलने का प्रयास करता हूं।NSTextField

कभी कभी, जब टाइपिंग सामग्री (नीचे या) ऊपर जा रहा पाठ क्षेत्र के दृश्य भाग शुरू के रूप में निम्नलिखित gif में दिखाया गया है शुरू:

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

+0

यह कोड परियोजना में नहीं है। मुझे नहीं पता कि इसके साथ क्या करने के लिए कुछ भी है लेकिन 'बनें फर्स्ट रेस्पॉन्डर' को कॉल न करें। प्रलेखन कहता है: "एनएसविंडो मेक फर्स्ट रेस्पॉन्डर (_ :) विधि, इस विधि को नहीं, ऑब्जेक्ट को पहला उत्तरदाता बनाने के लिए उपयोग करें। इस विधि को सीधे कभी भी नकारें।" – Willeke

+0

कोड पीआर के साथ एक शाखा में है। मैं जांच करूँगा कि आप क्या कह रहे हैं हालांकि – fespinozacast

+0

क्या यह वास्तव में दोनों दिशाओं में बढ़ने में सक्षम होने की आवश्यकता है? मुझे लगता है कि अगर इसे ऊंचाई समायोजित करने की जरूरत है तो इसे हल करना आसान होगा। – catlan

उत्तर

1

समस्या का एक हिस्सा यह है कि आप सीधे becomeFirstResponder विधि का आह्वान कर रहे हैं। आपको यह नहीं करना चाहिए।

documentation के अनुसार:

NSWindow makeFirstResponder (का प्रयोग करें _ :) विधि, इस पद्धति नहीं, को कोई चीज पहले प्रत्युत्तर बनाते हैं। कभी भी इस विधि को कभी नकारें।

इसके अलावा, क्या आपको वास्तव में क्षैतिज और लंबवत दोनों विकसित होने में सक्षम होने के लिए टेक्स्टफील्ड की आवश्यकता है? अकेले ऊंचाई पर आधारित गतिशील बनाना स्पष्ट रूप से अधिक सीधे आगे होगा।

संबंधित मुद्दे