我编写了Swift代码,试图从给定的自定义UIView类型的所有子视图中删除所有手势识别器。
let mySubviews = self.subviews.filter() {
$0.isKindOfClass(CustomSubview)
}
for subview in mySubviews {
for recognizer in subview.gestureRecognizers {
subview.removeGestureRecognizer(recognizer)
}
}
但是该for recognizer
行会产生编译器错误:
'[AnyObject]?' does not have a member named 'Generator'
我尝试将for recognizer
循环更改为for recognizer in enumerate(subview.gestureRecognizers)
,但这会产生编译器错误:
Type '[AnyObject]?!' Does not conform to protocol 'SequenceType'
我看到UIView的gestureRecognizers
方法[AnyObject]??
return,并且我认为双重包装的返回值使我感到震惊。谁能帮我?
更新:修改后的编译代码为:
if let recognizers = subview.gestureRecognizers {
for recognizer in recognizers! {
subview.removeGestureRecognizer(recognizer as UIGestureRecognizer)
}
}
通常,通过循环遍历视图数组来删除视图中的 所有 手势识别是(而且一直是)一个坏主意gestureRecognizers
。您应该只删除手势识别是
您 添加到视图,通过跟踪那些识别器在自己的实例变量。
这对于iOS 11中涉及拖放的视图具有新的重要性,因为UIKit向这些视图添加了自己的手势识别器以识别拖放。
您不再需要强制转换为UIGestureRecognizer
,因为UIView.gestureRecognizers
已更改为[UIGestureRecognizer]?
在iOS
9.0中键入。
另外,通过使用nil-coalescing运算符??
,您可以避免使用该if
语句。
for recognizer in subview.gestureRecognizers ?? [] {
subview.removeGestureRecognizer(recognizer)
}
但是,最简单的方法是:
subview.gestureRecognizers?.forEach(subview.removeGestureRecognizer)
我们还可以for
像这样在循环中对子视图进行过滤:
for subview in subviews where subview is CustomSubview {
for recognizer in subview.gestureRecognizers ?? [] {
subview.removeGestureRecognizer(recognizer)
}
}
或者我们可以将它们全部包装成一个表达式(为清楚起见而包装):
subviews.lazy.filter { $0 is CustomSubview }
.flatMap { $0.gestureRecognizers ?? [] }
.forEach { $0.view?.removeGestureRecognizer($0) }
使用.lazy
可以防止它创建不必要的临时数组。
这是Swift令人讨厌的事情之一。您的for循环仅在Objective-C中有效,但是在Swift中,您必须显式解开可选数组:
if let recognizers = subview.gestureRecognizers {
for recognizer in recognizers {
subview.removeGestureRecognizer(recognizer as! UIGestureRecognizer)
}
}
您可以强制拆开它(for recognizer in subview.gestureRecognizers!
),但是我不确定是否gestureRecognizers
可以返回nil
,如果返回,则会出现运行时错误,然后您将其强制拆开。
本文向大家介绍AndroidStudio:手势识别,包括了AndroidStudio:手势识别的使用技巧和注意事项,需要的朋友参考一下 一内容:设计一个手写字体识别程序。 二实现 ①建立一个存放手写字体的数据库 ②activity_main.xml 3.MainActivity.java 三效果 以上所述是小编给大家介绍的AndroidStudio手势识别详解整合,希望对大家有所帮助,如果大家有任
本文向大家介绍在Swift程序中实现手势识别的方法,包括了在Swift程序中实现手势识别的方法的使用技巧和注意事项,需要的朋友参考一下 在这次IOS应用开发教程中,我们打算实现手势识别。正如你所知道的,IOS支持大量的手势操作,它们能提供了很好的应用控制和出色用户体验。 让我们开始吧! 首先需要在Xcode中创建一个新的Single View Application: 然后点击Next,弹出的窗口
本文向大家介绍iOS UIPan手势识别器,包括了iOS UIPan手势识别器的使用技巧和注意事项,需要的朋友参考一下 示例 平移手势识别器可检测到拖动手势。以下示例将图像添加到视图控制器,并允许用户在屏幕上四处拖动图像。 目标C 迅速 注意:尽管UIPanGestureRecognizer对于检测任何拖动手势很有用,但是如果您只想检测基本手势(例如用户向左/向右或向上/向下拖动手指),请使用UI
本文向大家介绍Android手势识别功能,包括了Android手势识别功能的使用技巧和注意事项,需要的朋友参考一下 现在智能手机基本都是触摸操作,点击按钮是一种交互方式,同时手势相关的操作,比如滑动等等同样是很重要的交互方式。这篇文章是对安卓手势交互相关知识点的整理和总结,主要来源基于官方文档。 触摸交互中的概念 常用事件 首先要了解一些常用的事件: ACTION_DOWN:第一个手指按下 ACT
问题内容: 我正在寻找一种简单的方法,可以一次从一个超级视图中删除所有子视图,而不是一个一个地删除它们。 我缺少什么? 更新 我的应用有一个main 。我必须添加其他不同的视图作为子视图,以便提供一种导航。 因此,当单击按钮“打开”特定页面时,我需要删除所有子视图并添加新的子视图。 更新2-可行的解决方案(OS X) 我猜苹果已经解决了。 现在,它比以往更容易了,只需致电: 问题答案: 编辑:(感
我有一个UIView,它通过几个约束被放置在屏幕上。一些约束由superview拥有,另一些约束由其他祖先拥有(例如,可能是UIViewController的view属性)。 要澄清这些解决方案的问题,请考虑以下视图层次结构: 爷爷 父亲 我 儿子 女儿 现在假设我们创建了以下约束,并始终将它们附加到它们最近的共同祖先: null