Iphone UIModalTransitionStylePartialCurl与iOS 5中的子类元素行为奇怪

Iphone UIModalTransitionStylePartialCurl与iOS 5中的子类元素行为奇怪,iphone,uimodaltransitionstyle,Iphone,Uimodaltransitionstyle,我有一个uimodaltransationstylepartialcurl,它的行为很古怪。我的视图UILabel和UIButton会设置动画,就像标签帧一直在更改一样 在iOS 4或6中,它是静态工作的。我已经制作了一个关于这个虫子的视频 我找到了一个,但我不太了解它的实现。我在viewDidLoad中alloc和init所有元素,那么[self-layoutifneed]到底在哪里要帮忙吗 如果相关,我的代码如下(重构): 视图帧的设置似乎被部分页面卷曲动画创建的CATransaction捕

我有一个
uimodaltransationstylepartialcurl
,它的行为很古怪。我的视图
UILabel
UIButton
会设置动画,就像标签帧一直在更改一样

在iOS 4或6中,它是静态工作的。我已经制作了一个关于这个虫子的视频

我找到了一个,但我不太了解它的实现。我在viewDidLoad中alloc和init所有元素,那么
[self-layoutifneed]到底在哪里要帮忙吗

如果相关,我的代码如下(重构):


视图帧的设置似乎被部分页面卷曲动画创建的
CATransaction
捕获并设置动画。至少在您发布的代码中,帧不应该是
CGRectZero
,这似乎是iOS 5中的一个bug。特别是根据选民获得的投票数。这个答案很好地描述了这个问题


本质上,如果通过调用
[self layoutifneed]
强制新视图立即进行布局,则会强制视图系统认识到这些是当前帧值,而不是要设置动画的帧值。然后,即使这个bug仍然试图设置动画,它也是一个非操作。从a帧到a帧的动画设置在最坏的情况下是无法察觉的。而且,由于“buggy”动画将与curl动画同时完成,因此(实际上)对您来说并不重要。除了对
viewdiload

中的
layoutIfNeeded
进行一个无法解释的调用之外,您不能创建一个自定义的转换类吗。我建议你学习如何,因为这对你将来也有帮助设置所有子视图后,此问题消失。我在视图中放置了两个断点以进行进一步挖掘,似乎模态视图的
viewDidLoad
方法被调用了两次——一次是在动画开始之前,一次是在动画结束时。
- (void)viewDidLoad
{
[super viewDidLoad];


// Label
textLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 120, 280, 40)];
textLabel.text = @"Change password";
[self.view addSubview: textLabel];

// old password
oldPassword = [[UITextField alloc] initWithFrame: CGRectMake(20, 180, 280, 40)];
oldPassword.secureTextEntry = YES;
oldPassword.placeholder = @"Current Password";
oldPassword.returnKeyType = UIReturnKeyNext;
oldPassword.autocapitalizationType = UITextAutocapitalizationTypeNone;
oldPassword.delegate = self;
[self.view addSubview: oldPassword];

// New password
CGRect chosenPasswordFrame = oldPassword.frame;
chosenPasswordFrame.origin.y += 40;
chosenPassword = [[CustomTextField alloc] initWithFrame: chosenPasswordFrame];
chosenPassword.secureTextEntry = YES;
chosenPassword.placeholder = @"New Password";
chosenPassword.returnKeyType = UIReturnKeyGo;
chosenPassword.autocapitalizationType = UITextAutocapitalizationTypeNone;
chosenPassword.delegate = self;
[self.view addSubview: chosenPassword];

// Submit button
submitButton = [[UIButton alloc] initWithFrame:CGRectMake(20, chosenPasswordFrame.origin.y + chosenPasswordFrame.size.height + 20, self.view.frame.size.width - 40, 45)];
[submitButton setTitle:@"Submit" forState:UIControlStateNormal];
[submitButton addTarget:self action:@selector(changePassword) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview: submitButton];

self.view.backgroundColor = [UIColor colorWithPatternImage:[[AppTheme sharedTheme] changePasswordBackgroundImage]];

}