【问题标题】:UIView Swipe Animation GlitchesUIView 滑动动画故障
【发布时间】:2015-10-29 15:25:42
【问题描述】:

我正在尝试添加滑动以更改我的标签栏应用程序的视图。就像页面视图一样。

到目前为止,我的解决方案正在运行,但我在刷卡时出现故障,我认为这些是 view.frame (CGRectMake) 更改导致这些黑色故障,但我还没有弄清楚为什么会发生这种情况。

它不会发生在像模拟器一样糟糕的设备中,但仍然可见且不流畅。

所以在我的根 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

然后

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

}

然后

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

                }];


            }

       }
} 

如何使这个动画更流畅?

在剧烈滑动时,我也会收到内存警告。

【问题讨论】:

    标签: ios objective-c animation uiview uigesturerecognizer


    【解决方案1】:

    原来问题出在这一行

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

    每次 distance.x 更改时将 toView 定位到屏幕外都会导致故障

    这是我的完整解决方案

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-27
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 2013-07-28
      • 1970-01-01
      相关资源
      最近更新 更多