2010-08-30 19 views
20

मैं दो सबव्यूज़ (व्यू 1 और व्यू 2) के बीच एक संक्रमण बनाने का प्रयास कर रहा हूं। जब एक बटन दबाया जाता है तो मैं दृश्य 1 (सामने) फ्लिप करना चाहता हूं और व्यू 2 (बैक) दिखाता हूं। मैंने संक्रमण दोनों को देखने की कोशिश की है और संक्रमण WithView। प्रत्येक काम करता है - लेकिन प्रत्येक में एक समस्या है।संक्रमण का उपयोग कर संक्रमण व्यवहार FromView और संक्रमण WithView

संक्रमण FromView - पर्यवेक्षण को फ़्लिप करता है (पूरी विंडो दृश्य फ़्लिप, सबव्यू नहीं)। जब यह फ्लिप होता है - फ्लिप से पहले एक सबव्यू पर्यवेक्षण के सामने होता है, और दूसरा सबव्यू फ़्लिप के पीछे होता है - जैसा कि होना चाहिए। लेकिन मैं नहीं चाहता कि पर्यवेक्षक फ़्लिप करें, केवल सबव्यूज़।

संक्रमण WithView - केवल उप-दृश्यों को फ़्लिप करता है - लेकिन संक्रमण से पहले 'टू' व्यू प्रदर्शित होता है।

किसी के पास कोई सुझाव है?

-(IBAction) button1action:(id) sender { 

if ([sender tag] == 0) { 

    [UIView transitionFromView:view2 toView:view1 duration:2.0 
    options:UIViewAnimationOptionTransitionFlipFromLeft 
    completion:nil]; 
} 

else { 
    [view1 removeFromSuperview];  
    [self.view addSubview:view2]; 
    [UIView transitionWithView:view2 
    duration:2.0 
    options:UIViewAnimationOptionTransitionFlipFromRight + 
    UIViewAnimationOptionShowHideTransitionViews 
     animations:^{} 
    completion:nil]; 
} 
} 
+4

के आकार के बराबर जवाब के रूप में नीचे एक प्रश्न चिह्न, या अपनी खुद कि समुदाय की मदद करने के लिए अपने समस्या हल की एक जवाब दाखिल करें। – Sam

+0

उन्हें प्रश्न के रूप में प्रश्न क्यों चिह्नित करना चाहिए? : डी –

उत्तर

26

आपको एनीमेशन ब्लॉक में सबव्यूव को हटाने और जोड़ने की आवश्यकता है। साथ ही, मुझे लगता है कि संक्रमण WithView को सुपर व्यू को तर्क के रूप में ले जाना चाहिए। मुझे लगता है कि यह अधिकार प्राप्त करने के लिए आपको क्या करना है, एक कंटेनर व्यू का उपयोग करना है जो कि वही आकार है जैसा आप फ़्लिप करना चाहते हैं।

इस दस्तावेज़ से कॉपी किया जाता है:

[UIView transitionWithView:containerView 
     duration:0.2 
     options:UIViewAnimationOptionTransitionFlipFromLeft 
     animations:^{ [fromView removeFromSuperview]; [containerView addSubview:toView]; } 
     completion:NULL]; 
+0

यह – jjxtra

+1

काम नहीं करता प्रतीत होता है कंटेनर दृश्य कुंजी है। यह आईओएस 6 और आईओएस 7 – Jameo

12

मैं इस में ठीक उसी समस्या में पड़ गए हैं, और मैंने पहले जवाब के साथ सहमत हैं। ऐसा लगता है कि आपके पास एक सबव्यू से दूसरे सबव्यू में एक संक्रमण को एनिमेट करने के लिए एक कंटेनर दृश्य होना चाहिए।

मैं संक्रमण का उपयोग कर रहा हूं FromView दृष्टिकोण। एनीमेशन के पीछे पृष्ठभूमि रखने के लिए, आपको कंटेनर व्यू के लिए पृष्ठभूमि के साथ पर्यवेक्षक की भी आवश्यकता होगी।

मेरे कोड लगता है:

[UIView transitionFromView:view1 
         toView:view2 
         duration:0.5 
         options:UIViewAnimationOptionTransitionFlipFromRight | 
           UIViewAnimationOptionAllowUserInteraction | 
           UIViewAnimationOptionBeginFromCurrentState 
        completion:nil]; 
1

मैं एक ही आवश्यकता थी, और देखा कई दृष्टिकोण - सुझाव के लिए परतों (जो बहुत जटिल समाप्त होता है तो आप सिर्फ एक UIView के साथ सौदा करना चाहते हैं) का उपयोग करने से कि मुझे उप-विचारों के बीच संक्रमण के लिए "कंटेनर" की आवश्यकता थी। लेकिन अगर आप सिर्फ कुछ आगे पीछे हटना चाहते हैं, जैसे कि एक बजाना कार्ड या गेम टाइल पर फ़्लिप करना, मैंने एक लाइन बदल दिया:

(नोट: मेरे पास UIViews (टाइल्स [x] [y ]) एक ग्रिड में (एक गेम के लिए)। मेरे पास सभी टेबलफाइलनाम डेटाबेस टेबल/एरेज़ में हैं, जो गतिशील रूप से UIImageViews के UIImages में लोड किए जाते हैं। यूआईएममेज में कार्ड या टाइल के "बैक" के लिए छवि " tileBackPicImageNM "

तो मेरे कोड है कि बस वापस की एक छवि के लिए सामने छवि बदली था:।।

[tiles[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]]; 

जो ठीक काम करता है

लेकिन और अब, एक flipping कार्रवाई दिखाने के लिए है, यह है:

[UIView transitionWithView:tiles[indexX][indexY] duration:0.3 options:UIViewAnimationOptionTransitionFlipFromLeft 
        animations:^{ 
         [[indexX][indexY] setImage:[UIImage imageNamed:tileBackPicImageNM]]; 
        } 
        completion:NULL];  

मैं अलग "अवधि" पैरामीटर के साथ प्रयोग किया - बाद में यह एक नाव है कि मैं viewDidLoad दिनचर्या में सेट कर दिया। 0.3 से तेज लगभग दिखाई नहीं दे रहा है, और 1 या 2 का मान बहुत धीमा है ...

इसमें दो उप-विचार शामिल नहीं हैं, जो मेरा मामला बहुत उपयोगी है क्योंकि मैं विचारों का पदानुक्रम युक्त कंटेनरों की एक श्रृंखला नहीं चाहता था ... और नए स्तर आदि पर। हमेशा एरे को फिर से लोड करें ...

5

एक ही समस्या में भाग लेने के बाद मैं एरिक और सैम से सहमत हूं: या तो संक्रमण WithView या transitionFromView दोनों जो आप चाहते हैं, वही करेंगे जो आप उचित के कंटेनर व्यू बनाते हैं आकार जिसे आप फ़्लिप करना चाहते हैं। अन्यथा पूरी विंडो दृश्य फ्लिप होगा।

तो अगर View1 subview आप के साथ शुरू होता है और आप तो

UIView *containerView = [[UIView alloc] initWithFrame:appropriateSize]; 
[containerView addSubview:view1]; 

जोड़ने view2 को फ्लिप करना चाहते हैं और फिर चेतन करने के लिए सबसे आसान तरीका शायद है:

[UIView transitionFromView:view1 
        toView:view2 
        duration:2.0 
        options:UIViewAnimationOptionTransitionFlipFromLeft 
       completion:nil]; 
7

यहाँ मेरे कार्य समाधान है स्टब, 2 घंटे लगने वाली एक साधारण चीज़, हानिकारक: हमें चीजों को फ़्लिप करने के लिए 1 बटन मिला, UIView पैनल कहा जाता है जिसमें 2 दृश्य होते हैं जिन्हें मैं फ्लिप एनीमेशन के साथ स्वैप करना चाहता हूं।

-(void)viewDidLoad{ 
    [super viewDidLoad]; 
    UIButton *btnFlip = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 
    btnFlip.frame = CGRectMake(10, 10, 50, 30); 
    [btnFlip setTitle:@"flip" forState:UIControlStateNormal]; 
    [btnFlip addTarget:self action:@selector(flip) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:btnFlip]; 

    panel = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 300,300)]; 
    panel.backgroundColor = [UIColor darkGrayColor]; 
    [self.view addSubview:panel]; 

    panelBack = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)]; 
    panelBack.tag = 1; 
    panelBack.backgroundColor = [UIColor brownColor]; 
    [panel addSubview:panelBack]; 

    panelFront = [[UIView alloc] initWithFrame:CGRectMake(10, 40, 280, 200)]; 
    panelFront.tag = 2; 
    panelFront.backgroundColor = [UIColor whiteColor]; 
    [panel addSubview:panelFront]; 

    displayingFront = TRUE; 
} 

-(void)flip{ 

    [UIView transitionWithView:panel 
    duration:0.5 
    options:(displayingFront ? UIViewAnimationOptionTransitionFlipFromRight : UIViewAnimationOptionTransitionFlipFromLeft) 
    animations:^{ 
     if (displayingFront) { 
      //panelFront.hidden=TRUE; 
      //panelBack.hidden = FALSE; 
      [panelFront removeFromSuperview]; 
      [panel addSubview:panelBack]; 
     }else{ 
      //panelFront.hidden=FALSE; 
      //panelBack.hidden = TRUE; 
      [panelBack removeFromSuperview]; 
      [panel addSubview:panelFront]; 
     } 
    } 
    completion:^(BOOL finished){ 
     displayingFront = !displayingFront; 
    }]; 
} 
+0

कूल पर परीक्षण और काम कर रहा है ... पूरी तरह से काम करता है – RATTLESNAKE

0

ध्यान रखें कि कंटेनर दृश्य एक ठोस पृष्ठभूमि color.It आवश्यकता रखें इसका मतलब स्पष्ट color.This से कुछ और मेरी गलती थी और काफी लंबा समय बिताया यह पता लगाने की।

0

transitionFromView का उपयोग कर, आगे और पीछे दृश्य एक और (नहीं सुपर देखें) दृश्य के अंदर होना चाहिए। इस तरह यह पूरी स्क्रीन फ्लिप नहीं करेगा।

> superview 
>  another view 
>  backview 
>  frontview 

UIView.transitionFromView (frontView, toView: backView, अवधि: 0.5, विकल्प: .TransitionFlipFromLeft | .ShowHideTransitionViews) {

में समाप्त हो गया}

आप (एक और दृश्य बनाने के लिए चाहते हो सकता है) frontView

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