我正在使用此网站的代码
http://ramin.firoozye.com/2009/09/29/semi-modal-transparent-dialogs-on-the-iphone/
显示模态视图并删除 它。它显示很好,即从顶部下降,但当被移除它停止 就在它的出路只是一小段时间,但它明显 我怎么摆脱摊位。
我展示的视图是一个viewcontroller的视图,它是父母的一个memeber viewcontroller所以我调用这样的方法来显示
[self showModal:self.modalController.view]
隐藏
[self hideModal:self.modalController.view];
- (void) showModal:(UIView*) modalView
{
UIWindow* mainWindow = (((SessionTalkAppDelegate*) [UIApplication sharedApplication].delegate).window);
//CGPoint middleCenter = modalView.center;
CGPoint middleCenter = CGPointMake(160, 205);
CGSize offSize = [UIScreen mainScreen].bounds.size;
//CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, offSize.height * 1.5);
CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, -100); // start from top
modalView.center = offScreenCenter; // we start off-screen
[mainWindow addSubview:modalView];
// Show it with a transition effect
[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.3]; // animation duration in seconds
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
modalView.center = middleCenter;
[UIView commitAnimations];
}
// Use this to slide the semi-modal back up.
- (void) hideModal:(UIView*) modalView
{
CGSize offSize = [UIScreen mainScreen].bounds.size;
//CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, offSize.height * 1.5);
CGPoint offScreenCenter = CGPointMake(offSize.width / 2.0, -100);
[UIView beginAnimations:nil context:modalView];
[UIView setAnimationDuration:0.3];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDelegate:self];
[UIView setAnimationDidStopSelector:@selector(hideModalEnded:finished:context:)];
modalView.center = offScreenCenter;
[UIView commitAnimations];
}
- (void) hideModalEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
UIView* modalView = (UIView *)context;
[modalView removeFromSuperview];
//[modalView release];
}
答案 0 :(得分:1)
我认为你的问题源于(1)这实际上并不是真正的模态视图,(2)你似乎在响应者链中有两个活动的视图控制器。
(1)这不是真正的模态视图。它只是一个普通的子视图,作为主窗口的子视图添加。不同之处在于,真正的模态视图及其控制器捕获整个响应链,直到被解雇。所有触摸和事件(如抖动或旋转)都由模态视图或其控制器处理。这就是presentModalViewController:
的实际调用。它重定向响应链。
(2)现在你在响应者链中有两个视图控制器。主视图控制器继续运行并且在假模态视图控制器和视图移动时监听响应者链。由于假模态被添加为主视图控制器下方窗口的子视图,并且实际上是由主视图控制器添加的,因此主视图控制器始终处于活动状态并处理事件。
延迟很可能是由主视图控制器响应由主模式视图中的仿模式视图移动引起的某些事件引起的。当主控制器的视图(所有UIElements)被暴露时,它们会重绘自己产生事件。在实际模态视图中,事件不会在链中发送到主视图,直到模态视图消失。在这种情况下,他们是。
通过使主控制器成为仿模式视图的控制器,可以确保平滑的动画。这样,你最终得到一个普通的视图控制器来查看关系,而没有响应者链咆哮。
另外,这个:
- (void) hideModalEnded:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
......是不好的做法。不要使用void指针。使用id代替:
- (void) hideModalEnded:(NSString *)animationID finished:(NSNumber *)finished context:(id)context
...然后把它投到UIView。既然你传递了一个UIView子类,你可以把它设置为UIView。