xichen744/SPPage

关于页面切换动画一段代码的问题

Opened this issue · 3 comments

 UIView *oldSelectView = [self controllerAtIndex:oldSelectIndex].view;
                CGFloat backgroundIndex = [self.scrollView calcIndexWithOffset:self.scrollView.contentOffset.x width:self.scrollView.frame.size.width];
                UIView *backgroundView = nil;
                if (oldSelectView.layer.animationKeys.count > 0 && lastView.layer.animationKeys.count > 0) {
                    UIView *tmpView = [self controllerAtIndex:backgroundIndex].view;
                    if (tmpView != currentView && tmpView != lastView) {
                        backgroundView = tmpView;
                        backgroundView.hidden = YES;
                    }
                }

                [self.scrollView.layer removeAllAnimations];
                [oldSelectView.layer removeAllAnimations];
                [lastView.layer removeAllAnimations];
                [currentView.layer removeAllAnimations];
                
                [self moveBackToOriginPositionIfNeeded:oldSelectView index:oldSelectIndex];

中根据backgroundIndex得来的backgroundView 和 oldSelectView 这些view的相关操作有什么作用?是你文章里面说

非交互切换,模拟切换的动画,这里需要考虑的一个复杂情况是第一次动画还未结束就开始第二次,这时候需要提前结束第一次动画

但是对于这段代码真的是完全茫然的,还希望作者能稍微解释一下

还有就是模拟动画结束后的代码也有疑问

if (finished) {
                         pageSize = bSelf.scrollView.frame.size;
                            lastView.frame = CGRectMake(lastViewEndOrigin.x, lastViewEndOrigin.y, pageSize.width, pageSize.height);
                            
                            currentView.frame = CGRectMake(currentViewEndOrgin.x, currentViewEndOrgin.y, pageSize.width, pageSize.height);
                            
                            backgroundView.hidden = NO;
                            [bSelf moveBackToOriginPositionIfNeeded:currentView index:bSelf.currentPageIndex];
                            [bSelf moveBackToOriginPositionIfNeeded:lastView index:bSelf.lastSelectedIndex];
                            [bSelf scrollAnimation:animated];
                            [bSelf scrollEndAnimation:animated];
                        }

   lastView.frame = CGRectMake(lastViewEndOrigin.x, lastViewEndOrigin.y, pageSize.width, pageSize.height);
                            
   currentView.frame = CGRectMake(currentViewEndOrgin.x, currentViewEndOrgin.y, pageSize.width, pageSize.height);

不是被覆盖咯吗

这段代码的作用是为了让非相邻页面和相邻页面的非交互切换看起来一模一样。
解决了非相邻页面的非交互切换,中间的页面一闪而过的问题。
关于这段代码的怎么起作用的,等我周末有空补上详细的注释。

谢谢你的解释,但是我以为要模拟非相邻界面点击切换只需两个view之间产生动画,然后再把view重置frame和contentoffset 非动画置为toVC对应的contentoffset,但是backgroundView 和 移除 layer动画我自己不是很理解。希望能看见你的注释,谢谢。