繁体   English   中英

添加子视图控制器时,容器中断的UIView帧动画

[英]UIView frame animations in container break when adding children view controllers

所以我有一个我正在设置的自定义容器视图控制器,我有一个自定义动画,假设你在完美运行的子视图控制器之间滑动,直到我从占位符视图中取出临时UILabels将视图从子视图控制器添加到占位符。 如果我注释掉“addSubview”行,那么动画再次完美地运行,但很明显我没有任何孩子,这有点......

现在我说动画不起作用,但这并不完全正确,因为任何链接到我在init(即通知和用户占位符和子项)添加的内容都完美地动画。 虽然feed视图在它们下面是可见的,但是页眉和页脚栏有时只会让步。 如果我将触摸移动到y轴以及x,它会随机抽搐......这很奇怪。

用于设置和添加子VC的初始化代码:

UIStoryboard* sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    self.feedVC = (NiTActionFeedViewController*)[sb instantiateViewControllerWithIdentifier:@"Feed"];
    self.feedVC.delegate = self;
    [self addChildViewController:self.feedVC];
    self.feedVC.view.frame = self.mainPage.bounds;//mainPage view is the only UIView that is placed in the IB as template for the other views (so I don't have to worry about resizing for 4" retina^^;)
    [self.mainPage addSubview:self.feedVC.view];
    [self.feedVC didMoveToParentViewController:self];

    //notify
    self.notifyPage = [[UIView alloc] initWithFrame:CGRectOffset(self.mainPage.frame, -kPageShift, 0)];// this is one of the placeholder views
    [self.notifyPage setClipsToBounds:YES];

    self.notifyVC = (NiTNotificationViewController*)[sb instantiateViewControllerWithIdentifier:@"Notify"];
    self.notifyVC.delegate = self;
    [self addChildViewController:self.notifyVC];
    self.notifyVC.view.frame = self.notifyPage.bounds;
    [self.notifyPage addSubview:self.notifyVC.view];
    [self.notifyVC didMoveToParentViewController:self];

    //user
    self.userPage = [[UIView alloc] initWithFrame:CGRectOffset(self.mainPage.frame, kPageShift, 0)];
    [self.userPage setClipsToBounds:YES];

    self.userVC = (NiTUserViewController*)[sb instantiateViewControllerWithIdentifier:@"UserScreen"];
    self.userVC.delegate = self;
    [self addChildViewController:self.userVC];
    self.userVC.view.frame = self.userPage.bounds;
    [self.userPage addSubview:self.userVC.view];
    [self.userVC didMoveToParentViewController:self];

    [self.view addSubview:self.notifyPage];
    [self.view addSubview:self.userPage];

     //and then re-add the header and footer views so that the children don't cover them^^
    [self.view addSubview:self.headerbar];
    [self.view addSubview:self.headerButton];
    [self.view addSubview:self.footerbar];
    [self.view addSubview:self.footerButton];
    [self.view addSubview:self.rightPageIndicator];
    [self.view addSubview:self.leftPageIndicator];

这里是touchesMoved代码(如果你需要更多,那么让我知道,但即使最终它们也没有让步):

if (touches.count > 0) {
        UITouch* touch = [touches anyObject];
        CGPoint currentPoint = [touch locationInView:self.view];
        float diff = currentPoint.x - startingPoint.x;

        //currentScreen is an enum that I set on load and on trigger of the screen change so I always know what screen is showing and it is always accurate
        //this line is just to make sure we don't go past the "edge" of the screen and is working perfectly
        if ((self.currentScreen - (diff<0?-1:1)) > userScreen||(self.currentScreen - (diff<0?-1:1)) < notifScreen) {
            return;
        }


            self.headerbar.frame = CGRectOffset(initheaderbar, (int)(kHeaderBarShift * (diff/kPageShift)), 0);
            self.headerButton.frame = CGRectOffset(initheaderButton, kHeaderButtonShift * (diff/kPageShift), 0);
            self.footerbar.frame = CGRectOffset(initfooterbar, kFooterBarShift * (diff/kPageShift), 0);
            self.mainPage.frame = CGRectOffset(initmainPage, kPageShift * (diff/kPageShift), 0);
            self.userPage.frame = CGRectOffset(inituserPage, kPageShift * (diff/kPageShift), 0);
            self.notifyPage.frame = CGRectOffset(initnotifyPage, kPageShift * (diff/kPageShift), 0);

        //this always updates and looks right even though nothing changes on the screen
            NSLog(@"move main:%@(%@)\nnotify:%@\nuser:  %@",NSStringFromCGRect(CGRectOffset(initmainPage, kPageShift * (diff/kPageShift), 0)),NSStringFromCGRect(self.mainPage.frame),NSStringFromCGRect(CGRectOffset(initnotifyPage, kPageShift * (diff/kPageShift), 0)),NSStringFromCGRect(CGRectOffset(inituserPage, kPageShift * (diff/kPageShift), 0)));

            lastPoint = currentPoint;
    }else{
        //never seen this called thus why I have it here so I know if something mind blowing has happened
        NSLog(@"W.T.F");
    }

现在,你可能需要知道的最后一件事是我有一个“touchController”协议设置,可以在指向父节点的所有子节点中设置“touchDelegates”,以便他们接收的任何触摸都被转发到Container VC和他们都正确转发,所以不是它(如果是这样的话,动画根本不会起作用)......

帮助我Obi Wan Kenobi,你是我唯一的希望! 说真的,可以使用任何人都可以给予的任何帮助^^;

请求信息我几乎在屏幕上动画一切。 由于项目的性质,我无法发布截图或视频,但希望您能够与我一起使用下面的图表(对不起,我不是photoshop期望= P)。 图中没有显示的唯一内容是headerButton,但基本上它只是在headerBar的顶部,并且以稍慢的速度移动,因为它不会移动得那么远。 设计的想法是,如果你向一个方向滑动,它会向相反方向滑动屏幕(就像你期望的那样),并且页眉和页脚栏以不同的速度滑动,因为它们更短,所以它们上的项目总是可见的,但在显示您所在的一侧/页面时具有“酷”效果。 (两个酒吧都没有在屏幕上显示“结束”,“结束”直接到达屏幕边缘,但从未进入过它)所有常量都是这样。 kPageShift是屏幕宽度(320)。 其余的是他们需要在屏幕之间移动多远,因为它们除了页面之外都是不同的尺寸。 如果您需要更多信息,请告诉我们!

在此输入图像描述

关闭Storyboard文件中的AutoLayout。

已设置的约束导致您谈到的随机抽搐。

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM