2014-10-30 9 views
6

मैंने एसओ और अन्य मेलिंग सूचियों पर यहां मिले सभी सुझावों के बारे में सोचने की कोशिश की है, लेकिन मैं यह नहीं समझ सकता कि ऑटो लेआउट चालू होने पर एनीमेशन के साथ NSSplitView फलक प्रोग्रामेटिक रूप से कैसे ध्वस्त हो सकता है।ऑटो लेआउट का उपयोग करते समय एनीमेशन के साथ एक एनएसएसप्लिट व्यू फलक कैसे पतन करें?

यहाँ मैं अभी (मनोरंजन के लिए स्विफ्ट में लिखा) है, लेकिन यह कई मायनों में नीचे गिर जाता है:

@IBAction func toggleSourceList(sender: AnyObject?) { 
    let isOpen = !splitView.isSubviewCollapsed(sourceList.view.superview!) 
    let position = (isOpen ? 0 : self.lastWidth) 

    if isOpen { 
     self.lastWidth = sourceList.view.frame.size.width 
    } 

    NSAnimationContext.runAnimationGroup({ context in 
     context.allowsImplicitAnimation = true 
     context.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn) 
     context.duration = self.duration 

     self.splitView.setPosition(position, ofDividerAtIndex: 0) 
    }, completionHandler: {() -> Void in 
    }) 
} 

वांछित व्यवहार और उपस्थिति Mail.app, जो वास्तव में अच्छी तरह से एनिमेट होने का है।

मेरे पास https://github.com/mdiep/NSSplitViewTest पर एक पूर्ण उदाहरण ऐप उपलब्ध है।

+0

स्प्लिट व्यू के 'एनिमेटर' प्रॉक्सी को '-setPosition: ofDividerAtIndex: 'भेजने का प्रयास करें। –

+0

@ केनहोम्स मैंने कोशिश की है। कोई पाँसा नहीं। – mdiep

उत्तर

0

यदि आप ऑटो-लेआउट का उपयोग कर रहे हैं और आप दृश्य के आयामों/स्थिति के कुछ पहलू को एनिमेट करना चाहते हैं, तो आपके पास बाधाओं को एनिमेट करने में अधिक भाग्य हो सकता है। मैंने NSSplitView के साथ त्वरित रूप से जाना है लेकिन अभी तक सीमित सफलता के साथ ही मिले हैं। मैं एक बटन पुश के बाद विस्तार और पतन करने के लिए एक विभाजन प्राप्त कर सकता हूं, लेकिन मैं बाधाओं में दखल देने के कारण अन्य समस्याओं के भार के आसपास अपना रास्ता हैक करने की कोशिश कर रहा हूं। मामले में यह के साथ अपने अपरिचित में, यहाँ एक सरल बाधा एनीमेशन है:

- (IBAction)animate:(NSButton *)sender { 
    /* Shrink view to invisible */ 

    NSLayoutConstraint *constraint = self.viewWidthConstraint; 
    [NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) { 

     [[NSAnimationContext currentContext] setDuration:0.33]; 
     [[NSAnimationContext currentContext] setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault]]; 
     [[constraint animator] setConstant:0]; 

    } completionHandler:^{ 
     /* Do Some clean-up, if required */ 

    }]; 

याद रखिए कि आप केवल एक कमी constant चेतन कर सकते हैं, आप अपनी priority चेतन नहीं कर सकते।

10

ऑब्जेक्टिव-सी:

[[splitViewItem animator] setCollapse:YES] 

स्विफ्ट:

splitViewItem.animator().collapsed = true 

एप्पल के मदद से:

या नहीं, बच्चे ViewController इसी को SplitViewItem है col SplitViewController में समाप्त हो गया। डिफ़ॉल्ट नहीं है। इसे पतन या अनलॉक करने के लिए एनिमेटर प्रॉक्सी के साथ सेट किया जा सकता है। उपयोग की जाने वाली सटीक एनीमेशन को को "ध्वस्त" की कुंजी के साथ -नीमेशन शब्दकोश में सेट करके अनुकूलित किया जा सकता है। यदि यह स्प्लिट व्यू कंट्रोलर में जोड़े जाने से पहले YES पर सेट किया गया है, तो यह प्रारंभ में ध्वस्त हो जाएगा और स्प्लिट व्यू कंट्रोलर को तब तक लोड नहीं किया जाएगा जब तक यह अनलॉक नहीं हो जाता है। यह केवीसी/केवीओ अनुपालन है और यदि उपयोगकर्ता इंटरैक्शन से मूल्य बदलता है तो अपडेट किया जाएगा।

+1

दुर्भाग्यवश, 'NSSplitViewItem' 10.10 पर एक नई एपीआई का हिस्सा है। अगर इसका उपयोग करने में सक्षम थे, तो मुझे सवाल पूछने की आवश्यकता नहीं होगी। :) – mdiep

+0

संपादन की जांच करें। –

+3

मैं समझता हूं। लेकिन NSSplitViewItem केवल 10.10 और बाद में उपलब्ध है। – mdiep

1

मैं अंत में कुछ मदद के साथ यह पता लगा सकता था। मैंने अपनी टेस्ट प्रोजेक्ट को पुन: प्रयोज्य NSSplitView सबक्लास में बदल दिया है: https://github.com/mdiep/MDPSplitView

0

किसी कारण से मेरे स्क्रॉलव्यू के लिए फ़्रेम एनिमेट करने के तरीकों में से कोई भी काम नहीं करता है। हालांकि मैंने बाधाओं को एनिमेट करने की कोशिश नहीं की थी।

मैं एक कस्टम एनिमेशन बनाने विभक्त स्थिति चेतन करने के लिए समाप्त हो गया।

एनिमेशन: अगर कोई रुचि है, यहाँ मेरी समाधान है।ज:

@interface MySplitViewAnimation : NSAnimation <NSAnimationDelegate> 

@property (nonatomic, strong) NSSplitView* splitView; 
@property (nonatomic) NSInteger dividerIndex; 
@property (nonatomic) float startPosition; 
@property (nonatomic) float endPosition; 
@property (nonatomic, strong) void (^completionBlock)(); 

- (instancetype)initWithSplitView:(NSSplitView*)splitView 
        dividerAtIndex:(NSInteger)dividerIndex 
          from:(float)startPosition 
           to:(float)endPosition 
        completionBlock:(void (^)())completionBlock; 
@end 

एनीमेशन मीटर

@implementation MySplitViewAnimation 

- (instancetype)initWithSplitView:(NSSplitView*)splitView 
        dividerAtIndex:(NSInteger)dividerIndex 
          from:(float)startPosition 
           to:(float)endPosition 
        completionBlock:(void (^)())completionBlock; 
{ 
    if (self = [super init]) { 
     self.splitView = splitView; 
     self.dividerIndex = dividerIndex; 
     self.startPosition = startPosition; 
     self.endPosition = endPosition; 
     self.completionBlock = completionBlock; 

     [self setDuration:0.333333]; 
     [self setAnimationBlockingMode:NSAnimationNonblocking]; 
     [self setAnimationCurve:NSAnimationEaseIn]; 
     [self setFrameRate:30.0]; 
     [self setDelegate:self]; 
    } 
    return self; 
} 

- (void)setCurrentProgress:(NSAnimationProgress)progress 
{ 
    [super setCurrentProgress:progress]; 

    float newPosition = self.startPosition + ((self.endPosition - self.startPosition) * progress); 

    [self.splitView setPosition:newPosition 
       ofDividerAtIndex:self.dividerIndex]; 

    if (progress == 1.0) { 
     self.completionBlock(); 
    } 
} 

@end 

मैं इसे उपयोग कर रहा हूँ इस तरह - मैं एक 3 फलक स्प्लिटर दृश्य होता है और एक निश्चित राशि से/बाहर में दाएँ फलक चलती हूँ (235)।

- (IBAction)togglePropertiesPane:(id)sender 
{ 
    if (self.rightPane.isHidden) { 

     self.rightPane.hidden = NO; 

     [[[MySplitViewAnimation alloc] initWithSplitView:_splitView 
              dividerAtIndex:1 
                from:_splitView.frame.size.width 
                to:_splitView.frame.size.width - 235                            
         completionBlock:^{ 
       ; 
           }] startAnimation]; 
} 
else { 
    [[[MySplitViewAnimation alloc] initWithSplitView:_splitView 
             dividerAtIndex:1               
               from:_splitView.frame.size.width - 235 
               to:_splitView.frame.size.width 
            completionBlock:^{   
     self.rightPane.hidden = YES; 
            }] startAnimation]; 
    } 
} 
0

NSSplitViewItem (अर्थात व्यवस्थित NSSplitView की subview) पूरी तरह से, ढह किया जा सकता है अगर यह Zero आयाम (चौड़ाई या ऊंचाई) तक पहुंच सकता है। इसलिए, हमें एनीमेशन से पहले उचित बाधाओं को निष्क्रिय करने की आवश्यकता है और Zero आयाम तक पहुंचने की अनुमति दें। एनीमेशन के बाद हम फिर से आवश्यक बाधाओं को सक्रिय कर सकते हैं।

SO प्रश्न How to expand and collapse NSSplitView subviews with animation? के लिए मेरी टिप्पणी देखें।

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