- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想将 UIScreenEdgePanGestureRecognizer 添加到 UITableView,以便我可以从右侧边缘滑动以转到 Controller 层次结构中的下一个屏幕。
这工作正常,除非 TableView 在侧面显示了部分索引。在这种情况下,部分索引区域会处理触摸,因此我无法从边缘滑动。我希望能够同时支持边缘平移和部分索引点击以及垂直平移功能。
我尝试在 UITableView 之上添加一个 View 来处理滑动,但随后它处理了所有触摸并且表格 View 不再获得任何东西。
最佳答案
好的,所以我尝试了很多东西并提出了一个不理想但可行的解决方案。
问题的第一部分是部分索引作为 UITableView 的 subview 在其自己的 View 中。因此它会捕获您可能添加到 UITableView 的任何触摸或手势识别器。
第二个问题是部分索引 View 不是公共(public) API 的一部分。
所以我的解决方案是在部分索引 View 中添加一个 UIScreenEdgePanGestureRecognizer。
View 是私有(private)类 UITableViewIndex 的一个实例。为了得到它,我创建了一个 UITableView 扩展:
extension UITableView {
var sectionIndexView: UIView? {
for view in self.subviews {
if view.className() == "UITableViewIndex" {
return view
}
}
return nil
}
}
注意 上面的代码是脆弱的并且不是面向 future 的,因为如果 Apple 更改了类名或其在 View 层次结构中的位置,它将不再有效。在我的例子中,边缘滑动是一个方便的功能,屏幕顶部有一个“下一步”按钮。此外,我的大多数 View Controller 都没有表索引,所以如果它停止工作,它只会出现在几个屏幕上。因此,如果此解决方案在未来不起作用,那也没什么大不了的。
我还写了一个方便的函数来从任何 View 获取边缘手势识别器:
extension UIView {
var screenEdgePanGestureRecognizer: UIScreenEdgePanGestureRecognizer? {
guard let gestures = self.gestureRecognizers else {
return nil
}
for gesture in gestures {
if let edgePan = gesture as? UIScreenEdgePanGestureRecognizer {
return edgePan
}
}
return nil
}
}
我在 View Controller 的 viewDidLoad
方法中将 UIScreenEdgePanGestureRecognizer
添加到 UITableView
。
最后,在我的 View Controller 的 viewDidAppear
中,我检查手势识别器是否已添加到部分索引 View 中。如果还没有,那么我将其添加到那里。您需要在将部分索引添加到 TableView 后的某个时间点执行此操作 - 即不在 viewDidLoad
中。并且您需要确保没有多次添加手势识别器。
关于ios - 在具有部分索引的 UITableView 上使用从右到左的 UIScreenEdgePanGestureRecognizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45308875/
目前我正在使用 [self presentModalViewController :newVC animated:YES] 。我想从左/右/顶部/底部呈现带有推送效果的 newViewcontroll
我正在尝试实现“带有上一个和下一个的部分幻灯片”。这些部分的标记如下: Section 1 Section 2 Section 3 Prev Next 除具有 acti
我的问题与此处提出的问题几乎相同:question 不同的是,我想从右边切换第 2 位和第 4 位数字,而不是像另一个问题中那样从左边切换。所以在我的例子中最右边的数字是 1。示例:283926.67
我是一名优秀的程序员,十分优秀!