- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果我正在处理一个长时间运行的任务,我会从我的应用程序中的所有 View Controller 向用户展示一个“进度 View ”。这是一个存在于我的 MainWindow.xib 中的 UIView。我使用 AppDelegate 方法显示(淡入) View ...
- (void)showProgressView
{
self.progressView.hidden = NO;
[UIView animateWithDuration:1.0
animations:^(void) { self.progressView.alpha = 1.0; }];
}
当长时间运行的任务完成时,我使用以下 AppDelegate 方法淡出“进度 View ”...
- (void)hideProgressView
{
[UIView animateWithDuration:1.0
animations:^(void) { self.progressView.alpha = 0.0; }
completion:^(BOOL f) { self.progressView.hidden = YES; }
}];
}
我的问题是,随着进度 View 逐渐消失,下方 View 中的按钮/控件再次可见,它们在动画完全完成之前不可用(它们不响应触摸事件)并且“进度 View ”已隐藏。
在开始淡出动画之前,我是否可以将控制权传回底层 View ,以便它的按钮等在进度 View 淡出时正常工作?
编辑:我已经尝试失败的事情......
使用resignFirstResponder
- (BOOL)findAndResignFirstResponder:(UIView*)view
{
NSLog(@"looping %@", [view description]);
if (view.isFirstResponder)
{
[view resignFirstResponder];
return YES;
}
for (UIView *subView in view.subviews)
{
if ([self findAndResignFirstResponder: subView])
{
return YES;
}
}
return NO;
}
- (void)hideProgressView
{
// Recursively attempt to remove control from the progress view
BOOL result = [self findAndResignFirstResponder:self.progressView];
[UIView animateWithDuration:1.0
animations:^(void) { self.progressView.alpha = 0.0; }
completion:^(BOOL f) { self.progressView.hidden = YES; }
}];
}
使用endEditing
- (void)hideProgressView
{
// Attempt to remove control from the progress view
[self.progressView endEditing:YES];
[UIView animateWithDuration:1.0
animations:^(void) { self.progressView.alpha = 0.0; }
completion:^(BOOL f) { self.progressView.hidden = YES; }
}];
}
最佳答案
您可以尝试发送您的进度查看消息resignFirstResponder
。这应该使它下方的 View 成为第一响应者,因此您可以使用它的控件。
PS:我还认为您的进度 View 可能会填满整个显示屏;在这种情况下,更改第一响应者可能无济于事......
编辑:在您确认您的 View 正在全屏显示后...
如果你的 View 是全屏的,它会拦截你所做的所有触摸(因为当它没有完全隐藏/透明时,它会覆盖它后面的 View )。您有两个选择,要么让 View 变小,这样就没有重叠,要么让触摸被转发到它后面的 View 。
您可以通过多种方式完成后者,我希望其中一种对您有用:
您可以尝试在您的进度 View (它需要是自定义 UIView)中重写 touchesBegan
方法;
您可以尝试在进度 View 中覆盖hitTest
方法;
这是我会尝试的,例如在 touchesBegan
中:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
if (![self viewIsDisappearing])
[self.nextResponder touchesBegan:touches withEvent:event];
}
viewIsDisappearing
是您应该实现的方法,如果隐藏进度 View 的动画已经开始,则返回 YES。在动画期间, View 尚未隐藏,因此它会拦截触摸,然后您将这些触摸转发给下一个响应者。
有可能你还需要重写其他UIResponder的touche相关方法:
– touchesMoved:withEvent:
– touchesEnded:withEvent:
– touchesCancelled:withEvent:
编辑:
我找到了一个我的类,我在其中做了一些类似于我在这里建议的事情,只是没有使用 nextResponder
。
思路是:SDSTransparentView
是一个覆盖整个屏幕的UIView
。你像这样初始化它:
[[SDSTransparentView alloc] initWithContent:contentView andDelegate:delegate];
委托(delegate)实现了一个SDSTransparentViewProtocol
,它只包含一个方法:
-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event outsideOfView:(UIView*)view;
当用户触摸透明 View 上的任何地方时,它会通过调用协议(protocol)方法将触摸传递给代理。我建议你忽略 contentView
和 outsideOfView
参数(它们对我有用,但可能对你没用;你可以传递 nil 或者,更好的是,后面的 View 进度 View )。
你可以在我的 github 上找到类(class).您只需要 SDSTransparentView.* 文件。实际上,我只建议查看该类的实现方式(非常简短),并在您的进度 View 中执行相同的操作。
我可以保证这种方法有效!
关于iphone - 将控制权(响应者?)传递回下部 UIView,同时仍在上部 UIView 上执行淡出动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6682464/
我是一名优秀的程序员,十分优秀!