加载带有自定义转换的 XIB?

Posted

技术标签:

【中文标题】加载带有自定义转换的 XIB?【英文标题】:Load a XIB with custom Transition? 【发布时间】:2011-05-29 19:15:09 【问题描述】:

是否可以(完全)使用自定义 AnimationTransition 加载 XIB?

我所做的是创建一个“覆盖”屏幕的动画,我想要的是在该动画播放完毕后,我希望它显示新的 XIB。

我似乎找不到任何合适的解决方案...有什么想法吗?

为了更清楚:按一个按钮-->播放动画(封面屏幕)-->加载XIB。


你好!是的,你描述的最后一种方式就是我正在做的方式。我有两个 UIViews(可能已经错了),它们被放置在每一侧的边界之外,(如 x.-160.y.0 和 x.320y.0)

-(IBAction) leftDoor

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    closeDoor1.center = CGPointMake( closeDoor1.center.x +160, closeDoor1.center.y);


    [UIView commitAnimations];

  


-(IBAction) rightDoor

    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];

    closeDoor2.center = CGPointMake( closeDoor2.center.x -160, closeDoor2.center.y);

    [UIView commitAnimations];

所以,我要做的不是“拆分”当前视图然后打开一个新的 XIB,我正在寻找的效果是“关门”效果,这就是我使用 UIView 的原因(以为我放置上面的图形,比如两个 ImageView)。然后,为了加载新的 XIB ......这是我真正困惑的地方。我尝试的第一种方法是制作三个 IBAction,包括我上面提到的两个,然后将所有三个(多个操作)应用到一个按钮。所以为了切换视图,我做了这样的事情:`-(IBAction) newViewDisplay:(id)sender

theView *newViewController = [[theView alloc]
                                      initWithNibName:@"theView" bundle:nil]; 

[self.view addSubview:newViewController.view];

`

正如你所说,这可能超出了我的想象,但如果我只是得到一些指示,我会步行数英里来完成这项工作。它真的会让我的应用程序焕然一新。非常感谢您花时间回答我的问题,一切顺利/安迪

【问题讨论】:

XIB 中有什么?它是视图控制器还是只是视图等?然后你需要加载它。之后,您可以应用动画。 它是一个 ViewController。那么,如果我先加载它,我会在代码中声明动画吗?函数内?抱歉,有点困惑...谢谢! 是的,你加载它,添加一个动画块,然后将新视图动画到屏幕上。 感谢您的回答!我试过了,但它似乎不起作用......我不知道我是否足够清楚,但我想要“动画”(从越界 UIViews 覆盖屏幕,中间的相遇)开始和结束在显示新的 XIB 之前。我不知道这是否可能,但我已经在一些应用程序中看到它......如果你有时间,你能输入一些代码并指出我正确的方向吗?如果您没有时间,仍然非常感谢您的回答。如果您将其发布为答案,我可以接受。谢谢 【参考方案1】:

你用什么遮住屏幕?

这样想,(听起来像)你有 2 个视图,旧的和新的存储在这个 xib 中。动画是次要的。

您需要加载新视图,然后将其显示(可以在屏幕外),然后将其动画(移动)到您想要的位置。如果你想把它分成两部分,一个在屏幕底部,一个在屏幕顶部,然后在中间相遇,我认为这既复杂又超出你的技能水平。 (这里不想刻薄)。

如果您尝试按照描述制作分割动画,可以这样做,但您需要“伪造”。这将涉及拍摄“屏幕截图”(各种),拆分它,移动这两个图像以便它们与动画相遇,加载下面的视图,然后删除图像。棘手的东西。

这种动画一定要吗?

如果您可以发布您拥有的代码,我可以为您重新排列并添加代码。

不过,您需要明确自己想要做什么。

更新 3:我为自动反转添加了另一个选项。

//您可以将两扇门添加到一个动画块中。

    //Create an animation block. Ease Out is better for this animation but you can change it.
[UIView animateWithDuration:1.0 delay:0.0 options:(UIViewAnimationOptionCurveEaseOut | UIViewAnimationOptionAutoreverse) animations:^
    closeDoor1.center = CGPointMake( closeDoor1.center.x +160, closeDoor1.center.y);
    closeDoor2.center = CGPointMake( closeDoor2.center.x -160, closeDoor2.center.y);

completion:^(BOOL finished)
    if (finished) 
            //When finished, create the VC if it doesn't exist, and insert it below the 'closed door'.

        if (newViewController == nil) 
            UIViewController *newViewController = [[UIViewController alloc] initWithNibName:@"theView" bundle:nil]; 
        

        [self.view insertSubview:newViewController.view belowSubview: closeDoor2];;
        [self.closeDoor1 removeFromSuperview];
        [self.closeDoor2 removeFromSuperview];

    
];

【讨论】:

我是 *** 的新手,所以下面是我对评论的回答:) 一些代码和一些解释。谢谢! 只需编辑您的原始问题,然后将您在回答中的内容移至原始问题。 非常感谢!这个问题的解决方案可能就在我面前,但是......我实现了你的代码(再次感谢)并且还在 XIB(按钮所在的那个)中创建了一个新的 VC,将“newViewController”连接到文件所有者,动画效果很好..虽然完成后,它只显示一个白屏。我确定我一定错过了一步。您认为可能是什么问题? 没问题,我忘了移除“门”。示例已更新。只是玩弄一些东西,但我认为这个动画块是你想要的。不过请记住,从 ios 4.0 开始,块是新的,在此之前它们不会工作。如果您需要支持 3.2 及以下版本,我们可以做到,但工作量更大。 我的朋友,你是 A-W-E-S-O-M-E!它就像一种魅力,说真的,当我开始工作时,我跳起了胜利之舞!我现在要做的(完成它)是在 viewDidLoad 中做一个动画“反转”,所以当加载新视图时,用户会感觉就像一个快门被打开和关闭。再次感谢您,我的朋友,祝您度过愉快的一天!

以上是关于加载带有自定义转换的 XIB?的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义 xib 的 TableCellView 未加载

iPhone IOS5 Storyboard,如何加载带有自定义 .xib 文件的 UIViewController?

从 XIB 加载自定义视图,如何使其响应自定义子类?

带有自定义 UIToolbar xib 的 Storyboard 中的 UINavigationController 失败

带有 xib 文件和自定义构造函数的自定义 UITableViewCell

带有 .xib 文件的 UIPickerView 自定义布局