动画完成后所有 UIElement 都变得不可访问

2023-12-30

我正在尝试通过具有每个灯光坐标的 CGRect 数组来实现城市灯光动画。然后围绕这些 CGRect 创建 UIView。这个逻辑(感谢Darren https://stackoverflow.com/users/1077601/darren用于帮助实现此逻辑)工作正常,但是动画完成后,屏幕上的所有其他元素(UIButtons、Sliders、其他 UIImageViews 等)都将变得无法访问。甚至我的滑动手势也没有响应。在动画之前和期间,所有元素都响应良好,但一旦动画完成,它们都将变得无法访问。我也尝试过[UIView bringSubviewToFront:]将一些元素放在前面,看看这是否有助于使它们易于访问,但没有帮助。我认为这不是问题,因为即使我尝试通过将灯光发送到背景来创建灯光视图[self.view sendSubviewToBack:light];动画完成后,一切都变得无法访问。

如果有人可以帮助/建议我我缺少什么,我将不胜感激。

这是我的代码逻辑和城市灯光动画的相应场景。 rects 和 lits 是 ivars。

- (void)viewDidLoad {
    pageCount=5;
    AVAudioSession * audioSession = [AVAudioSession sharedInstance];
    //Setup the audio session
    //...
    pageNum=1;
    //put imageviews in place
    //...
    //load a page
    [self loadPage];
    [self loadAudio];

    [self cityLightsSetUp];
    [super viewDidLoad];
}


-(void)loadPage{
    //Logic to load page...    
    /...
    if (pageNum == 3){
      [self startCityLights];
    }
}


- (void)cityLightsSetUp
{
    rects = [[NSMutableArray alloc] init];
    lit = [[NSMutableArray alloc] init];
    [rects addObject:[NSValue valueWithCGRect:CGRectMake(58, 217, 10, 10)]];
    [rects addObject:[NSValue valueWithCGRect:CGRectMake(71, 217, 10, 10)]];
    [rects addObject:[NSValue valueWithCGRect:CGRectMake(84, 217, 10, 10)]];
    [rects addObject:[NSValue valueWithCGRect:CGRectMake(97, 217, 10, 10)]];

    [rects addObject:[NSValue valueWithCGRect:CGRectMake(58, 231, 10, 10)]];
    [rects addObject:[NSValue valueWithCGRect:CGRectMake(71, 231, 10, 10)]];
    [rects addObject:[NSValue valueWithCGRect:CGRectMake(84, 231, 10, 10)]];
    [rects addObject:[NSValue valueWithCGRect:CGRectMake(97, 231, 10, 10)]];

    [rects addObject:[NSValue valueWithCGRect:CGRectMake(58, 245, 10, 10)]];
    [rects addObject:[NSValue valueWithCGRect:CGRectMake(71, 245, 10, 10)]];
    [rects addObject:[NSValue valueWithCGRect:CGRectMake(84, 245, 10, 10)]];
    [rects addObject:[NSValue valueWithCGRect:CGRectMake(97, 245, 10, 10)]];

    [rects addObject:[NSValue valueWithCGRect:CGRectMake(58, 258, 10, 10)]];
    [rects addObject:[NSValue valueWithCGRect:CGRectMake(71, 258, 10, 10)]];
}

- (void)startCityLights
{
    [self lightRandomLight];
    [self performSelector:@selector(switchOffRandomLight) withObject:nil afterDelay:1.0];
}

- (void)lightRandomLight
{
    BOOL escape = NO;
    int rand;

    while (!escape) {
        BOOL alreadyLit = NO;
        rand = arc4random() % [rects count];
        // Check if already lit
        for (UIView *view in lit) {
            CGRect litRect = view.frame;
            CGRect ranRect = [[rects objectAtIndex:rand] CGRectValue];
            if (CGRectContainsRect(litRect, ranRect)) {
                alreadyLit = YES;
            }
        }

        if (!alreadyLit) {
            UIView *light = [[UIView alloc] initWithFrame:[[rects objectAtIndex:rand] CGRectValue]];
            light.backgroundColor = [UIColor orangeColor];
            [lit addObject:light];
            [self.view addSubview:light];
            //[self.view sendSubviewToBack:light];
            escape = YES;
        }
    }

    [self performSelector:@selector(lightRandomLight) withObject:nil afterDelay:0.2];
}

- (void)switchOffRandomLight
{
     NSLog(@"switchOffRandomLight");
    int rand = arc4random() % [lit count];
    UIView *light = [lit objectAtIndex:rand];
    [lit removeObject:light];
    [light removeFromSuperview];

    [self performSelector:@selector(switchOffRandomLight) withObject:nil afterDelay:0.5];
}

看起来,一旦所有灯都亮起,while 循环就会连续运行,尝试获取未亮起的随机数。这就是阻塞主线程的原因。

您所需要的只是在方法开始时检查所有灯是否都亮起,如果没有则继续。

在 lightRandomLight 方法的底部,替换

[self performSelector:@selector(lightRandomLight) withObject:nil afterDelay:0.2];

with

if ([lit count] != [rects count]) {
    [self performSelector:@selector(lightRandomLight) withObject:nil afterDelay:0.2];
} else {
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
}

当所有灯都亮起时它就会停止。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

动画完成后所有 UIElement 都变得不可访问 的相关文章

  • 是什么导致了这个 iPhone 崩溃日志?

    我有点卡住了 需要解决这个问题 因为我的一个应用程序出现了随机崩溃 而这些崩溃并不总是能够重现 这是崩溃日志之一 Incident Identifier 59865612 9F00 44EA 9474 2BF607AD662E CrashR
  • iOS 10 的错误? NSDate 日本地区时间描述和 24 小时休息

    这似乎是 iOS 10 的一个错误 在 iOS 8 和 9 中都可以 NSDate date description 的小时描述是错误的 它附加了 24 小时描述和 12 小时描述 我没有使用 NSDateFormatter 只是默认设置
  • UISplitViewController - 推送模态视图

    使用 UISplitViewController 时推送模态视图的最佳实践是什么 您会从 RootViewController DetailViewController 还是直接从应用程序委托推送 理想情况下 我想要实现的功能是在基于某些条
  • 由于语言错误,Itunes Connect 无法提交

    Thats all it shows https i stack imgur com 0aZm8 png 我不确定它没有告诉我出了什么问题 it shows its linked to the language https i stack
  • 如何在 Swift 3 中解析 JSON 数组 [重复]

    这个问题在这里已经有答案了 我从 Socket 获取了一些我想访问的数据 但收到错误消息 指出每次都无法将 NSArray 转换为 NSDictionary struct SocketEventHandler let event Strin
  • 如何检测Retina高清显示屏?

    UIScreen有一个新的 nativeScaleiOS 8 中的属性 但文档没有提及它 property nonatomic readonly CGFloat nativeScale 还有一个scale属性 但文档说它是 2 用于视网膜显
  • 适用于 Objective-C / iPhone 的良好 HTTP 库? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 UPDATE 这个问题显然已经过时了 参见日期 我建议只使用现代 iOS7 功能 例如 NSURLSession 我想 这个问题是为了历史
  • iOS 8 中的 UISplitViewController 状态恢复

    在 iOS 8 上 UISplitViewController 似乎可以保存和恢复其子视图的状态 例如 主视图是否隐藏 这是不可取的 因为我的应用程序应该始终以横向方式显示主视图 并始终以纵向方式隐藏它 如果用户以横向模式关闭应用程序 保存
  • UICollectionView 未出现

    我正在尝试设置UICollectionView 以编程方式在我的视图控制器中扩展UIViewController 由于某种原因 我的收藏视图根本没有显示 以下是我所拥有的 为什么没有出现 我将它连接到委托和数据源并将其添加为子视图self
  • 确定 NSView 是否绘制的正确方法

    有没有正确的方法来确定是否NSView实际上是否在当前视图层次结构中绘制 考虑以下情况 视图完全在屏幕外 不是强制性的 该视图不在视图层次结构的顶部 The isHidden and isHiddenOrHasHiddenAncestor不
  • iOS UIButton 带有圆角和背景 bug

    我发现圆形 UIButton 存在一个奇怪的问题 这是我创建此按钮的代码块 let roundedButton UIButton type System roundedButton frame CGRectMake 100 100 100
  • 避免“在此块中强烈捕获自身可能会导致保留周期”消息

    每次我必须在块内使用全局变量或属性时 如下所示 self save if isItSaving NO self saveMyFile 我必须像这样重写 BOOL iis isItSaving id myself self self save
  • iPhone 快照,包括键盘

    我正在寻找拍摄整个 iPhone 屏幕 包括键盘 的正确方法 我找到了一些截取屏幕的代码 CGRect screenCaptureRect UIScreen mainScreen bounds UIView viewWhereYouWant
  • 我可以知道 requireGestureRecognizerToFail 到底会做什么吗?

    谁能告诉我下面的代码行到底会做什么 我已经提到过Apples https developer apple com library ios documentation uikit reference UIGestureRecognizer C
  • 使用 UIImageJPEGRepresentation 时,compressionQuality 应该是多少?

    我想对用户库中的照片应用滤镜 然后将其写回磁盘 我在用着UIImageJPEGRepresentation 该函数需要一个UIImage and a compressionQuality值介于 0 0 和 1 0 之间 因为我想保留原始质量
  • 如何将音乐从我的应用程序切换到 iPod

    我在用MusicPlayerController我的应用程序中的对象来播放音乐 我知道当 iPhone ipod 应用程序终止时 可以继续播放我的应用程序音乐 我该怎么做 这涉及到一些事情 您必须在两种音乐播放器之间进行选择 应用程序音乐播
  • iOS WKWebView.scrollView委托导致BAD_ACCESS

    我的 viewController 有一个 UIView 属性 其中包含一个 WKWebView 我将 WKWebView rollView 委托设置为我的 viewController 它是我的 UIView 子类的公共函数 并在我的 v
  • 在 Instruments 中查找内存泄漏行

    我是 iOS 中的仪器新手 我正在尝试使用 Xcode 4 5 2 并按照本教程查找仪器中的内存泄漏 http soulwithmobiletechnology blogspot sg 2011 04 how to check memory
  • 显示键盘时如何在 TextView 下方添加更多填充

    当我在 ScrollView 中有 TextField 并点击它时 键盘会按预期显示 但似乎 TextField 已向上移动到足以显示输入区域 但我希望移动到足够的位置 以便整体可见 否则它看起来像是被剪裁了的 我找不到改变这种行为的方法
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值

随机推荐

  • Realm Swift 仅在本地使用,但它仍然尝试在线连接

    我正在关注Realm Swift 入门指南在这里 https realm io docs swift latest 并且工作正常 我有以下对象 class Dog Object dynamic var name dynamic var ag
  • 为什么下面的 Scala 函数被称为闭包?

    对于以下问题 http pastie org 4825115 http pastie org 4825115 这是我的代码 http pastie org private n22zohyshn2ymqrbrb3g http pastie o
  • 如何在 Android 应用程序中运行 shell 脚本?

    我正在尝试为 root 用户编写一个 android 应用程序 该应用程序运行一系列 shell 命令 或者一个 shell 脚本 如果更好的话 并显示输出 任何人都可以指出我正确的方向吗 此代码片段需要 root 访问权限 但会将给定的字
  • Excel VBA 根据单元格值将特定工作表导出为 PDF

    我想使用单元格值Sheet 4选择并导出Sheet 1 Sheet 2 and Sheet 3作为一个 PDF 文件 例如 如果第 4 页A1 1 A2 1 A3 0 则打印Sheet 1 and Sheet 2 但不是Sheet 3 我尝
  • Postgresql 中的奇怪行为

    我是 Postgresql 新手 我正在尝试从 MySQL 迁移我的应用程序 我有一个具有以下结构的表 Table public tbl point Column Type Modifiers Storage Description Tag
  • int** 和 const int** 可以使用别名吗?

    据我了解 这样的事情是可以的 const int ci 42 const int cip ci int ip int cip int j ip 那这个呢 const int ci 42 const int cip ci const int
  • 如何准备 Word 2007 文档以便 C# 可以从语义上提取数据?

    我有一个朋友正在写一篇400页书在 Microsoft Word 2007 中 在整本书中他都200 个故事每个都由许多段落组成 当他写完这本书后 他想将嵌入 Word 文档中的每个故事的文本复制到一个数据库表例如 Title varcha
  • 如何有条件地显示 ASP.NET MVC Razor 中的字段?

    我对 C 和 ASP NET MVC Razor 非常陌生 如果该字段不为空 我想在我的视图中显示该字段 Code tr class hide td class editor label Html LabelFor model gt mod
  • 如何使用mysql全文获取连续单词的频率

    我有一个MyISAM表包含超过 200 万条记录 其中有一个FULLTEXT多列索引 给定一个搜索词 我想知道多少次它出现在每个记录的索引字段中 例如 当搜索 test 在下表中 其中有一个FULLTEXT两者的索引FREETEXT and
  • 显示第一类类型

    我有一个项目列表 每个项目都有一个类 并且该类在整个过程中重复 我只想显示每个类的第一个实例 只用 CSS 就可以实现吗 ul li class red red li li class red red li li class blue bl
  • 读取和解析大型 XML 文件的性能问题

    我有一个目录 其中包含几个大型 XML 文件 总大小约为 10 GB 有没有办法遍历包含 XML 文件的目录并读取 50 字节乘 50 字节并以高性能解析 XML 文件 func mdc Mdc Loadxml path string wg
  • 如何更改 R 中的时间序列(XTS 或 ZOO)?

    我是 stackoverflow 的新手 对 R 也相当陌生 但经过长时间的艰苦搜索 找不到以下问题的答案 我有许多数据文件 它们是温度与时间序列的关系 我将 CSV 作为 ZOO 对象导入 然后转换为 XTS 正确的文件如下所示 其中包含
  • 在 Protractor / E2E 测试中访问 $http 数据 (AngularJS)

    我有一堆进展顺利的单元测试 并且我已经开始将 Protractor E2E 测试添加到我的项目中 我在页面上测试交互元素做得很好 但在测试从浏览器发送的某些数据时遇到问题 例如 我想看看点击某个按钮是否会产生一个POST到某个端点 我使用以
  • 如何删除 BottomBar jetpack compose 中选定的椭圆形项目颜色

    我想删除所选项目后面的蓝色椭圆形颜色 我怎样才能做到这一点 NavigationBarItem selected selected onClick onClick icon if selected selectedIcon else ico
  • 如何使用具有 2 个或更多根的 try_files

    我看了一遍又一遍 发现没有这样的实现 我想知道我正在尝试的是否可能 我有 3 个提供静态内容的相对路径 Path1 usr local www style1 static Path2 usr local www style2 static
  • 视图控制器调用 awakeFromNib 两次

    我面临着这个奇怪的问题 我不确定我哪里出了问题 情况 我有一个 MainWindowController 类 它将加载要显示的正确笔尖 我创建了一个对象并将其更改为 IB 中的 MainWindowController 类 并将其与 Mai
  • 如何在 Keras 中找到错误的预测?

    我构建了一个 Keras 模型 用于从文本输入的原始输入中提取信息 我得到的准确度为 0 9869 我如何知道哪些训练数据导致准确性降低 我已将我正在使用的代码粘贴在下面 import numpy as np from keras mode
  • 如何遍历 json 响应?

    我有这个 json 响应 我正在尝试遍历它以获取天气条件 例如 湿度 和 温度 C 等 我尝试了一些方法但没有成功 data current condition cloudcover 50 humidity 44 observation t
  • 删除指针是否也会删除它所指向的内存?

    如果我有一个像这样的指针 int test new int 我创建了另一个指向的指针test像这样 int test2 test 然后我删除test2 delete test2 这是否意味着它将删除test以及 或者我必须打电话delete
  • 动画完成后所有 UIElement 都变得不可访问

    我正在尝试通过具有每个灯光坐标的 CGRect 数组来实现城市灯光动画 然后围绕这些 CGRect 创建 UIView 这个逻辑 感谢Darren https stackoverflow com users 1077601 darren用于