2015-10-29 18 views
5

Sto cercando di aggiungere lo scorrimento per cambiare la visualizzazione alla mia applicazione tabbar. Come una visualizzazione di pagina.Uiview Swipe Animation Glitches

Finora la mia soluzione funziona, ma ottengo glitch mentre strisciata, presumo questi sono view.frame (CGRectMake) cambia causando quei difetti neri, ma mi hanno né ricontattato capire perché sta accadendo.

Non succede nel dispositivo come un simulatore ma è ancora visibile e non è scorrevole.

enter image description here

quindi nel mio radice tabbar controllore (TabViewController : UITabBarController)

#import <QuartzCore/QuartzCore.h> 

#define XCTabViewDummyNSUintegerNOTargetVC 10 
#define XCTabViewSwipeYAxisMax 40 
#define XCTabViewSwipeXAxisMax 40 

@interface XCTabViewController() 
@property (nonatomic, strong) id<XCTabControlStrategy> tabStrategy; 
@property double swipeRatio; 
@property double toViewX; 
@property double fromViewX; 

@property UIView * fromView; 
@property UIView * toView; 
@end 

poi

-(void)viewDidAppear:(BOOL)animated 
{ 
    XCDeviceType deviceType = [UIViewUtils currentDeviceType]; 

    swipeRatio = 320; 

    switch (deviceType) { 

     case XCiPhone4: 
      swipeRatio = 320; 
      break; 

     case XCiPhone5: 
      swipeRatio = 320; 
      break; 

     case XCiPhone6: 
      swipeRatio = 375; 
      break; 

     case XCiPhone6Plus: 
      swipeRatio = 414; 
      break; 

     default: 
      swipeRatio = 320; 
      break; 
    } 

    // add pan recognizer to the view when initialized 
    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panRecognized:)]; 
    [panRecognizer setDelegate:(id)self]; 
    [self.view addGestureRecognizer:panRecognizer]; // add to the view you want to detect swipe on 

} 

poi

-(void)panRecognized:(UIPanGestureRecognizer *)sender{ 

    CGPoint distance = [sender translationInView: self.view]; 

    if (sender.state == UIGestureRecognizerStateChanged) { 

     if (distance.x > XCTabViewSwipeXAxisMax && distance.y > -XCTabViewSwipeYAxisMax && distance.y < XCTabViewSwipeYAxisMax) { // right 
      [sender cancelsTouchesInView]; 
      NSLog(@"user swiped right"); 
      NSLog(@"swipe direction \n ---------------->"); //view on the left should be displayed 
      NSLog(@"distance.x %f", distance.x); 
      if (self.selectedIndex >= 1) { 
       NSUInteger targetVc = self.selectedIndex - 1; 
       // Get the views. 
       fromView = self.selectedViewController.view; 
       toView = [[self.viewControllers objectAtIndex:targetVc] view]; 

       // Get the size of the view area. 
       CGRect viewSize = fromView.frame; 

       // Add the to view to the tab bar view. 
       [fromView.superview addSubview:toView]; 

       // Position it off screen. 
       toView.frame = CGRectMake(-swipeRatio, viewSize.origin.y, swipeRatio, viewSize.size.height); 


       [UIView animateWithDuration:0 animations:^{ 
        // Animate the views on and off the screen. This will appear to slide. 
        fromView.frame =CGRectMake(distance.x, viewSize.origin.y, swipeRatio, viewSize.size.height); 
        toView.frame =CGRectMake(-swipeRatio+distance.x, viewSize.origin.y, swipeRatio, viewSize.size.height); 

        toViewX = -swipeRatio+distance.x; 
        fromViewX = distance.x; 

       }]; 


      } 

     } 
} 

Come posso rendere più agevole questa animazione?

Inoltre, durante lo scorrimento intensivo, ricevo avvertenze sulla memoria.

risposta

2

Risulta problema era in questa linea

// Position it off screen. toView.frame = CGRectMake(-swipeRatio, viewSize.origin.y, swipeRatio, viewSize.size.height);

posizionamento toview fuori dallo schermo everytime modifiche distance.x che stava causando difetti

qui è la mia soluzione completa

NSLog(@"user swiped right"); 
    NSLog(@"swipe direction \n ---------------->"); //view on the left should be displayed 
    NSLog(@"distance.x %f", distance.x); 
    if (self.selectedIndex >= 1) { 
     NSUInteger targetVc = self.selectedIndex - 1; 

     // Get the views. 
     if (!fromView) { 
      fromView = [[UIView alloc] init]; 
      fromView = self.selectedViewController.view; 

     } 
     // Get the size of the view area. 
     CGRect viewSize = fromView.frame; 

     if (!toView) { 
      toView = [[UIView alloc] init]; 
      toView = [[self.viewControllers objectAtIndex:targetVc] view]; 



      // Position it off screen. 
      toView.frame = CGRectMake(swipeRatio, viewSize.origin.y, swipeRatio, viewSize.size.height); 

      // Add the to view to the tab bar view. 
      [fromView.superview addSubview:toView]; 
     } 


     [UIView animateWithDuration:0 animations:^{ 
      // Animate the views on and off the screen. This will appear to slide. 
      fromView.frame = CGRectMake(distance.x, viewSize.origin.y, swipeRatio, viewSize.size.height); 
      toView.frame = CGRectMake(-swipeRatio+distance.x, viewSize.origin.y, swipeRatio, viewSize.size.height); 

      toViewX = -swipeRatio+distance.x; 
      fromViewX = distance.x; 

     }];