2012-03-01 13 views
21

यह एक iPad परियोजना जहाँ मैं कई subviews के साथ एक UIView है (जनक दृश्य flipping के बिना), और मैं का उपयोग कर [UIView transitionFromView इस UIViews में से एक चेतन करने के लिए कोशिश कर रहा हूँ: toView: अवधि: विकल्प : पूरा होने], लेकिन जब मैं इस विधि को चलाता हूं तो पूरा माता-पिता दृश्य फिसल जाता है! इस कोड मैं का उपयोग कर रहा है:एक व्यक्ति UIView फ्लिप कैसे करें

UIView *secondView = [[UIView alloc] initWithFrame:CGRectMake(200, 200, 300, 300)]; 
[newView setBackgroundColor:[UIColor redColor]]; 
    [UIView transitionFromView:self.firstView.view toView:secondView duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:nil]; 

कैसे मैं पूरी जनक दृश्य एनिमेट के बिना इस दृश्य के बीच फ्लिप कर सकते हैं पर कोई विचार? धन्यवाद!

उत्तर

70

इस मई कोड में सहायक है:

दो दृश्य आप एक ही आकार और लिंक के साथ एक अनाम दृश्य के अंदर फ्लिप करना चाहते डाल विचारों को IBOutlet UIView *newView,*oldView; और शीर्ष

bool a = NO; 

@implementation ViewController 

- (IBAction)flip:(id)sender 
{ 
    if (a == NO) { 
     [UIView transitionFromView:oldView toView:newView 
        duration:1.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
        completion:NULL]; 
     a = YES; // a = !a; 
    } 
    else { 
     [UIView transitionFromView:newView toView:oldView 
        duration:1.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
        completion:NULL]; 
     a = NO; // a = !a; 
    } 
} 
+5

धन्यवाद एक बहुत! समाधान एक कंटेनर दृश्य का उपयोग करना था। – DanMunoz

+0

@ Floris497, आपने मेरा दिन बचाया। बहुत बहुत धन्यवाद :) – Ahmed

+1

इसके लिए धन्यवाद। मुझे लगा कि यह समाधान था। मुझे लगता है कि संक्रमण एक चाल से अधिक है, यह मूल दृश्य पर एक फ्लिप एनीमेशन करता है, और आपके द्वारा निर्दिष्ट सबव्यूव के बाहर आधे रास्ते के माध्यम से आधा रास्ता करता है। फिर फिर, अधिकांश एनिमेशन आदि .. आईफोन पर एक चाल है :-) – Dermot

2

अपने subviews धारण करने के लिए एक कंटेनर दृश्य का उपयोग करें, और कंटेनर अपने subview के रूप में एक ही आकार है कि आप चेतन की कोशिश कर रहे देखने बनाते हैं।

तो, आप इस तरह के अपने विचार सेट कर सकते हैं।

self.view-> "एक कंटेनर दृश्य" -> subviews

2
**//flipping view continuously** 



bool a = NO; 


-(void)viewDidLoad 
{ 



// THIS is the canvass holding the two views this view is flipping 
UIView *v=[[UIView alloc]initWithFrame:CGRectMake(40, 40, 150, 150)]; 

    v.backgroundColor=[UIColor clearColor]; 

    [self.view addSubview:v]; 

    [v addSubview:yourfirstview]; 
    [v addSubview:yoursecondview]; 

// calling the method 

[NSTimer scheduledTimerWithTimeInterval:2.0 
            target:self 
            selector:@selector(flip) 
            userInfo:nil 
            repeats:YES]; 

} 



//flipping view randomly 

-(void)flip 

{ 

if (a == NO) 
{ 

[UIView transitionFromView:yourfirstview toView:yoursecondview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; 
     a = YES; 
    } 

else if(a==YES) 
{ 

[UIView transitionFromView:yoursecondview toView:yourfirstview duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:NULL]; 
    a = NO; 
    } 

} 
37

मैं भी काम करने के लिए समस्याओं इस हो रही थी पर नए दृश्य डाल दिया। मैंने फ्लोरिस द्वारा लिखे गए कोड का इस्तेमाल किया, लेकिन हालांकि यह पहली "फ्लिप" के लिए काम करता था, हालांकि अगली फ्लिप अजीब होनी शुरू हुई जहां फ्रोंटसाइड यूआई व्यू पर बटन और लेबल वहां स्थित स्थिति खो गए।

मैंने कोड को नीचे रखा है और यह ठीक काम कर रहा है।

चीजों की युगल गौर करने योग्य

  1. panelView ViewController अंदर यह (subviews) नेस्ट दो अन्य UIViews है पर एक UIView नियंत्रण है। पहले को फ्रंटव्यू कहा जाता है, दूसरा को बैक व्यू कहा जाता है। (नीचे चित्र देखें)

image of the view and subviews in IB

  1. मैं एक bool संपत्ति वर्ग

पर displayingFront कहा जाता है (मेरे ज में)

@property BOOL displayingFront; 
मेरी मीटर में

@synthesize displayingFront; 

मेरी viewDidLoad विधि

self.displayingFront = YES; 

इस में मीटर है कि मैं दो बटन है, तो आगे और पीछे UIViews अप करने के लिए धांधली की है में कोड है ...

- (IBAction)flip:(id)sender 
{ 
    [UIView transitionWithView:self.panelView 
         duration:1.0 
         options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight : 
           UIViewAnimationOptionTransitionFlipFromLeft) 
        animations: ^{ 
         if(displayingFront) 
         { 
          self.frontView.hidden = true; 
          self.backView.hidden = false; 
         } 
         else 
         { 
          self.frontView.hidden = false; 
          self.backView.hidden = true; 
         } 
        } 

        completion:^(BOOL finished) { 
         if (finished) { 
          displayingFront = !displayingFront; 
         } 
        }]; 
} 
+0

मुझे लगता है कि यह उत्तर – RonPelayo

+0

से अधिक साफ है इस दृष्टिकोण के साथ अंतर यह है कि एनिमेशन फ़्लिप के बाद होता है ... इसलिए फ्रंटव्यू छुपा हुआ है और फ्लिप के बाद बैक व्यू प्रदर्शित होता है। उपर्युक्त विस्तृत "ट्रांज़िशन फ्रॉम व्यू" दृष्टिकोण मिडपॉइंट पर दृश्य जोड़ता है ताकि फ़्लिप पूरा हो जाने तक, "toView" पहले से ही दिखा रहा है। – wuf810

+0

धन्यवाद! इसने संक्रमण समस्याओं (लेबल) के गलत स्थान के साथ मेरी समस्याओं को हल किया। वे स्क्रीन पर बिखरे हुए थे। –

2

मैं ओल्ड-स्कूल एनिमेशन का उपयोग करके इस समस्या का समाधान होने:

[UIView beginAnimations:@"Flip" context:nil]; 
[UIView setAnimationDuration:1]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:firstView cache:YES]; 

[self addSubview:secondView]; 

[UIView commitAnimations]; 

इसके अतिरिक्त आप firstView निकाल सकते हैं:

[firstView removeFromSuperview]; 

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

  • कोई संबंधित समस्या नहीं^_^