gpt4 book ai didi

ios - 从 viewDidLoad 动画帧变化

转载 作者:行者123 更新时间:2023-11-29 03:41:05 33 4
gpt4 key购买 nike

我想在 View 加载时将按钮和标签移动到特定位置。起初,所有内容都位于中心,当加载时,所有内容都应该扩展到指定位置。我有这个,但图标和标签不动。如果我在同一 View 中创建一个按钮并将代码放入其中,它就可以工作。

     #import "DashViewController.h"

@interface DashViewController ()

@end

@implementation DashViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}

- (IBAction)backb:(id)sender{
[self dismissModalViewControllerAnimated:YES];
}

- (IBAction)loadanim:(id)sender{
[self moveIcons];
}


-(void)moveIcons{

CGRect framehi = homeIcon.frame;
framehi.origin.x = 15;
framehi.origin.y = 70;
CGRect framehl = homeLabel.frame;
framehl.origin.x = -8;
framehl.origin.y = 136;

CGRect framesmi = smediaIcon.frame;
framesmi.origin.x = 131;
framesmi.origin.y = 70;
CGRect framesml = smediaLabel.frame;
framesml.origin.x = 108;
framesml.origin.y = 136;

CGRect framemi = mediaIcon.frame;
framemi.origin.x = 249;
framemi.origin.y = 70;
CGRect frameml = mediaLabel.frame;
frameml.origin.x = 225;
frameml.origin.y = 136;

CGRect frameni = newsIcon.frame;
frameni.origin.x = 15;
frameni.origin.y = 211;
CGRect framenl = newsLabel.frame;
framenl.origin.x = -8;
framenl.origin.y = 277;

CGRect framebi = bullyIcon.frame;
framebi.origin.x = 131;
framebi.origin.y = 211;
CGRect framebl = bullyLabel.frame;
framebl.origin.x = 108;
framebl.origin.y = 277;

CGRect framespi = sportsIcon.frame;
framespi.origin.x = 249;
framespi.origin.y = 211;
CGRect framespl = sportsLabel.frame;
framespl.origin.x = 225;
framespl.origin.y = 277;

CGRect framesti = staffIcon.frame;
framesti.origin.x = 15;
framesti.origin.y = 355;
CGRect framestl = staffLabel.frame;
framestl.origin.x = -8;
framestl.origin.y = 421;

CGRect framehbi = handbookIcon.frame;
framehbi.origin.x = 131;
framehbi.origin.y = 355;
CGRect framehbl = handbookLabel.frame;
framehbl.origin.x = 108;
framehbl.origin.y = 421;

CGRect frameai = aboutIcon.frame;
frameai.origin.x = 249;
frameai.origin.y = 355;
CGRect frameal = aboutLabel.frame;
frameal.origin.x = 225;
frameal.origin.y = 421;

[UIView animateWithDuration:0.3 animations:^{
homeIcon.frame = framehi;
homeLabel.frame = framehl;
smediaIcon.frame = framesmi;
smediaLabel.frame = framesml;
mediaIcon.frame = framemi;
mediaLabel.frame = frameml;
newsIcon.frame = frameni;
newsLabel.frame = framenl;
bullyIcon.frame = framebi;
bullyLabel.frame = framebl;
sportsIcon.frame = framespi;
sportsLabel.frame = framespl;
staffIcon.frame = framesti;
staffLabel.frame = framestl;
handbookIcon.frame = framehbi;
handbookLabel.frame = framehbl;
aboutIcon.frame = frameai;
aboutLabel.frame = frameal;
}];

}

- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[self moveIcons];
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

@end

最佳答案

您不应将与几何相关的代码放入 viewDIdLoad 中,因为此时尚未设置 View 框架。此外,在 View 出现在屏幕上之前,动画代码没有任何意义 - 尝试将其移动到 viewDidAppear

更新

从您的努力和评论来看,您的问题既是“如何调试”又是“我的代码出了什么问题”(除了您调用它的位置之外,我看不到您的代码有任何问题!) .

总结
- 您已将代码移至单独的方法(实际上您提到了“自定义 void 语句” - 我不确定您的意思,请按照下面的代码使用方法...)
- 您可以从 viewDiDAppear 和使用 [self animate]; 的按钮操作调用相同的方法- 从viewDidAppear调用,它不运行。从按钮操作调用,确实如此。

因此,您需要准确地找出代码失败的位置。

首先,我建议将测试代码减少到最少。仅对一个对象进行动画处理:

- (void) animate {
CGRect framehi = homeIcon.frame;
framehi.origin.x = 15;
framehi.origin.y = 70;

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration: 0.25];

homeIcon.frame = framehi;

[UIView commitAnimations];
}

在调用该方法之前和之后进行一些日志记录:

   NSLog(@"pre-animated frame: %@",NSStringFromCGRect(homeIcon.frame);
[self animate];
NSLog(@"post-animated frame: %@",NSStringFromCGRect(homeIcon.frame);

从中您可以判断框架是否在动画方法中设置。您在评论中没有说清楚 - 如果动画失败,框架也无法设置吗?如果只是动画失败,是否有任何其他正在运行的动画代码可能会干扰它?您是否以一种不寻常的方式过渡到此 View ?

尝试从其他方法调用动画方法,例如 viewWillAppear:animatedviewWillLayoutSubviews。您确定您的viewDidAppear方法肯定被调用了吗?

将此日志语句放在所有相关方法的开头: NSLog(@"%s",__func__);它将准确地显示哪些方法被调用、何时被调用。

尝试在 viewWillAppear 的开头放置一个断点并单步执行,观察变量以了解在何处设置了什么。 只是动画失败了吗?

如果是这样,请尝试使用动画 block 来触发动画:

  [UIView animateWithDuration:0.5 animations:^{
homeIcon.frame = framehi;
}];

(这应该没有什么区别,但它是更现代的方式)

您需要针对该错误提出一些更好的线索,因为它不在您发布的代码中。正如我所说,我已经在 viewWillAppearviewDiDAppear 中测试了您的确切代码,它工作正常。也许您的方法签名不正确并且没有被调用?

当你有了更好的想法时,如果你仍然无法解决它,那么要么编辑你的问题,要么开始一个新的问题。如果您编辑问题,请添加您正在使用的确切测试代码,包括方法调用/签名、日志结果。

但不要将结果添加为评论,其他人更难提供帮助。

祝你好运

关于ios - 从 viewDidLoad 动画帧变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18436035/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com