NSView का आकार बदलने पर पता लगाने का सही तरीका क्या है? मुझे दृश्य या दृश्य के लिए किसी प्रतिनिधि पर उपलब्ध कोई भी आकार बदलने वाला कार्यक्रम नहीं दिख रहा है।

मैंने इस हैक को जोड़ा है, जहां मैं आकार में परिवर्तन का पता लगाने के लिए drawRect का उपयोग करता हूं, लेकिन मुझे यकीन है कि ऐसा करने का एक और सही तरीका होना चाहिए।

    CGRect m_resizeRect = CGRect.Empty;
    public override void DrawRect(CGRect dirtyRect)
    {
        base.DrawRect(dirtyRect);
        if (this.InLiveResize) {
            if (m_resizeRect.Size != this.Bounds.Size) {
                m_resizeRect = this.Bounds;
                this.OnResize();
            }
        }
    }
    public override void ViewWillStartLiveResize()
    {
        m_resizeRect = this.Bounds;
        base.ViewWillStartLiveResize();
    }
    public override void ViewDidEndLiveResize()
    {
        m_resizeRect = CGRect.Empty;
        base.ViewDidEndLiveResize();
    }
    protected void OnResize() {
        Console.WriteLine("OnResize " + this.Bounds.ToString() );
    }
2
Jesper Kristiansen 30 जिंदा 2016, 07:52

4 जवाब

सबसे बढ़िया उत्तर

आप आकार बदलने की सूचनाओं की सदस्यता ले सकते हैं।

पर्यवेक्षक को डिफ़ॉल्ट सूचना केंद्र में जोड़ें:

NSObject NSWindowDidResizeNotificationObject;
public override void ViewDidLoad ()
{
    base.ViewDidLoad ();
    NSWindowDidResizeNotificationObject = NSNotificationCenter.DefaultCenter.AddObserver (new NSString ("NSWindowDidResizeNotification"), ResizeObserver, null);
}

एनएसएनोटिफिकेशन क्रिया:

public void ResizeObserver (NSNotification notify)
{
    var r = this.View.Frame;
    Console.WriteLine ("{0}:{1}:{1}", notify.Name, r.Height, r.Width);
}

पर्यवेक्षक निकालें (और स्मृति जारी करें):

NSNotificationCenter.DefaultCenter.RemoveObserver (NSWindowDidResizeNotificationObject);

नमूना आउटपुट:

NSWindowDidResizeNotification:740:740
NSWindowDidResizeNotification:715:715
NSWindowDidResizeNotification:681:681
NSWindowDidResizeNotification:642:642
3
SushiHangover 30 जिंदा 2016, 10:21

आप सेटफ्रेमसाइज विधि को ओवरराइड कर सकते हैं और हर बार फ्रेम अपडेट होने पर अपना सामान खुद कर सकते हैं।

class MyView: NSView {
    ...
    override func setFrameSize(newSize: NSSize) {
        super.setFrameSize(newSize)
        Swift.print("new size is \(frame)")
    }
    ...
}

स्वीकृत उत्तर केवल खिड़की के आकार में बदलाव का जवाब देता है, उदा। जब स्प्लिटव्यू का स्प्लिट-बार आकार बदलने का कारण बनता है।

3
Hans 7 सितंबर 2016, 18:34

NSView देखें postsBoundsChangedNotifications और postFrameChangedNotifications प्रॉपर्टीज। आप उन्हें सेट कर सकते हैं और उन सूचनाओं के लिए पंजीकरण कर सकते हैं।

2
Gerd K 30 जिंदा 2016, 08:19

आप NSViewController.viewDidLayout() ओवरराइड विधि का उपयोग कर सकते हैं:

class MyViewController: NSViewController {
    ...
    override func viewDidLayout() {
        Swift.print("view has been resize to \(self.view.frame)")
    }
    ...
}
2
Martin Delille 4 अक्टूबर 2016, 13:32