UIView Swipe Animation Glitches

I am trying to add swipe to change view in tab app. How to view the page.

So far, my solution works, but I get scrolling crashes, I assume that these are view.frame ( CGRectMake ) CGRectMake that cause these black glitches, but I don't know why this is happening.

The device is not as bad as a simulator, but still visible and not smooth.

enter image description here

so in my root controller tabbar ( 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 

then

 -(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 } 

then

 -(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; }]; } } } 

How can I make this animation smoother?

Also, when scrolling intensively, I get warnings about memory.

+5
source share
1 answer

The problem in this line is turned off

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

offView positioning of the screen every time distance.x changes caused glitches

here is my complete solution

  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; }]; 
+2
source

Source: https://habr.com/ru/post/1234804/


All Articles