gpt4 book ai didi

iphone - 将控制权(响应者?)传递回下部 UI​​View,同时仍在上部 UIView 上执行淡出动画

转载 作者:行者123 更新时间:2023-11-29 11:21:49 25 4
gpt4 key购买 nike

如果我正在处理一个长时间运行的任务,我会从我的应用程序中的所有 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 。

您可以通过多种方式完成后者,我希望其中一种对您有用:

  1. 您可以尝试在您的进度 View (它需要是自定义 UIView)中重写 touchesBegan 方法;

  2. 您可以尝试在进度 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)方法将触摸传递给代理。我建议你忽略 contentViewoutsideOfView 参数(它们对我有用,但可能对你没用;你可以传递 nil 或者,更好的是,后面的 View 进度 View )。

你可以在我的 github 上找到类(class).您只需要 SDSTransparentView.* 文件。实际上,我只建议查看该类的实现方式(非常简短),并在您的进度 View 中执行相同的操作。

我可以保证这种方法有效!

关于iphone - 将控制权(响应者?)传递回下部 UI​​View,同时仍在上部 UIView 上执行淡出动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6682464/

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