2011-01-15 12 views
5

मेरे पास मेरे सहयोगियों में से एक था, तो के documentView को लोड या देखने के तरीके के साथ मेरे पास मेरे सहयोगियों में से एक था ताकि लोड किया गया दृश्य दिखाई दे नीचे-कोने कोने के बजाय ऊपरी-बाएं कोने में ठीक करें।निचले बाएं के बजाय NSScrollView सामग्री को सेट करना, जब दस्तावेज़ स्वैपिंग

उन्होंने वेब पर खोज करते समय थोड़ी देर बिताई और फ्लैरिंगरिंग और ऐप्पल, स्टैक ओवरफ्लो और अन्य कई स्थानों पर प्रलेखन पढ़ने के बावजूद समाधान नहीं किया।

इंटरफ़ेस बिल्डर में परियोजना में एक NSScrollView खींचें:

यहाँ मुद्दा टुकड़ा-दर-टुकड़ा है। इसके अलावा परियोजना में इंटरफ़ेस बिल्डर खींचें दो कस्टम दृश्य में और कुछ textfields जोड़ने के लिए, बटन आदि

एक नियंत्रक वर्ग (जैसे myController) निम्नलिखित IBOutlet रों साथ बनाएँ:

  • IBOutlet NSScrollView * myScrollView
  • IBOutlet NSView * myCustomView1
  • IBOutlet NSView * myCustomView2

के आउटलेट से कनेक्ट इंटरफ़ेस बिल्डर में नियंत्रण।

@implementation myFlippedView 

-(id)initWithFrame:(NSRect)frame { 
    self = [super initWithFrame:frame]; 
    if (self) { 
     // Initialization code here. 
    } 
    return self; 
} 

-(void)drawRect:(NSRect)dirtyRect { 
    // Drawing code here. 
} 

-(BOOL)isFlipped { 
    return YES; 
} 

इंटरफ़ेस बिल्डर में NSScrollView की documentView का चयन करें और यह myFlippedView का एक उपवर्ग बनाने:

फ्लिप करने documentView एक NSView उपवर्ग बनाएँ। इंटरफ़ेस बिल्डर में आप NSScrollView का चयन करेंगे और फिर documentView पर जाने के लिए फिर से क्लिक करें, या एक वृक्ष दृश्य दिखाने के लिए आईबी लाइब्रेरी बदलें और NSScrollView के बच्चे के कस्टम दृश्य का चयन करें।

myController वर्ग स्वैप में निम्न विधियों के साथ विचार:

-(void)awakeFromNib { 

    [myScrollView setDocumentView:myCustomView1]; 
} 

-(IBAction)swapViews:(id)sender { 

    if ([myScrollView documentView] == myCustomView1) { 

     [myScrollView setDocumentView:myCustomView2]; 

    } else { 

     [myScrollView setDocumentView:myCustomView1]; 

    } 
} 

अंत में कार्रवाई swapViews अपनी परियोजना में एक बटन ऊपर हुक, निर्माण और चलाते हैं।

समस्या यह है कि समन्वय को हल नहीं किया जा रहा था जैसा कि अपेक्षित था।

उत्तर

7

इसके लिए एक सरल, लेकिन स्पष्ट रूप से अक्सर अनदेखा कारण है।

हालांकि isFlipped इंटरफ़ेस बिल्डर में कस्टम दृश्य को उप-वर्गीकृत कर रहा है, दस्तावेज़ दृश्य दृश्य स्वैप पर प्रतिस्थापित हो रहा है, जिसमें से पहला awakeFromNib पर उपयोग किया जाता है।

समाधान myCustomClass1 और myCustomClass2 को myFlippedView क्लास में उप-वर्ग करना है।

ऐसा करें और इसका परीक्षण करें और आप देखेंगे कि विचार अब स्क्रॉल व्यू के ऊपरी बाईं ओर दिखाई देते हैं। हालांकि, इसने एक नई समस्या बनाई है। कस्टम व्यू में मौजूद सभी सामग्री अब नीचे से ऊपर तक रखी गई है (क्योंकि डिफ़ॉल्ट रूप से सभी NSView लेआउट नीचे बाईं ओर से हैं, इसलिए फ़्लिपिंग भी उनके निर्देशांक फ़्लिप करती है)।

सौभाग्य से इस समस्या के लिए एक और आसान फिक्स है। इस पर पढ़ें :-)

इंटरफ़ेस बिल्डर में, myCustomView1 में सभी नियंत्रणों को हाइलाइट करें और Layout मेनू से, एम्बेड ऑब्जेक्ट इन -> कस्टम व्यू का चयन करें। जैसा कि आपको करने की आवश्यकता है, उसका आकार बदलें, मेरे कस्टम व्यू 2 और पुनर्निर्माण के लिए भी ऐसा ही करें।

वोला। एक सामग्री दृश्य दृश्य के साथ एक NSScrollView नीचे बाईं ओर स्क्रॉल दृश्य के ऊपरी-बाईं ओर स्वैपिंग और दिखाई दे रहा है।

+1

या आप सरल मार्ग पर जा सकते हैं और केवल स्वैप किए गए दृश्यों को दस्तावेज़ दृश्य बनाने के बजाय myFlippedView का एक सबव्यूव बना सकते हैं। – ughoavgfhw

+0

जो आप कर सकते थे। अच्छी बात। – Hooligancat

+0

हालांकि यह एक नई समस्या पेश करता है। यदि आप खिड़की का आकार बदलकर दस्तावेज़ दृश्य से स्क्रॉल दृश्य को छोटा बनाते हैं, तो यह दृश्य के नीचे शीर्ष पर पिन करता है। एक उपयोगकर्ता के रूप में आप बाद वाले की अपेक्षा करेंगे। –

0

सही ढंग से करने के लिए documentView शुरू में scrollview के शीर्ष करने के संरेखित और करने के लिए भी पिन यह शीर्ष जब documentView छोटे की तुलना में यह clipview है करने के लिए, यह क्या मेरे लिए काम करता है:

1 - में इंटरफ़ेस बिल्डर आपके दस्तावेज़ में सभी नियंत्रण संलग्न करें कस्टमNSView उदाहरण में देखें। (नहीं एक फ़्लिप देखें)

2 - documentView के लिए प्रयोग की जाने वाली एक NSView उपवर्ग बनाएँ, और ओवरराइड इन तरीकों:

- (BOOL)isFlipped { 
    return YES; 
} 
- (void)resizeWithOldSuperviewSize:(NSSize)oldSize { 
CGFloat superViewHeight = self.superview.frame.size.height, height = self.frame.size.height; 
    if(superViewHeight>height) { 
     [self setFrameOrigin:NSMakePoint(self.frame.origin.x, superViewHeight-height)]; 
    } 
} 

subclassed दृश्य होना चाहिए scrollViews 'documentView जो दूसरी शामिल (सामान्य) NSView जिसमें सभी नियंत्रण शामिल हैं।

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