ScrollView - 手势识别器 - 垂直滑动
ScrollView - Gesture Recognizer - Swipe vertically
我有一个 UIScrollView 可以在向左或向右滑动时工作,但是我已经减小了 scrollView 的大小,所以现在显示区域不会完全占据超级视图的框架,并且滑动只能在滚动视图。
我希望即使在缩小滚动视图的水平边界之外上下滑动时也能垂直滚动。
有人建议我使用手势识别器,但这超出了我目前对 iOS 的熟悉程度,可以使用更具体的建议或更多指导来开始使用。
我没有时间详细回答但是:
在情节提要中,将平移手势识别器拖到滚动视图的超级视图上...将其操作与您的视图控制器连接起来,并在此操作中使用您作为参数获得的手势识别器的属性更改滚动视图位置
提示:在组合框
中连接动作时将参数类型从Any
更改为UIPanGestureRecognizer
请不要将此答案视为在您的问题中使用此方法的建议,我不知道这是否是最好的方法,我只是帮助您尝试一下
有一种更简单的方法,然后使用手势识别器 =]
您可以设置滚动视图的超级视图(更大...)以将触摸传递给滚动视图。它正在工作 M-A-G-I-C-A-L-Y =]
首先,select 将所有触摸传递给滚动视图的视图。如果您的父视图已经可以,您可以使用它。否则你应该考虑添加一个你想要的大小的新视图,它会捕捉到触摸。
现在创建一个新的 class(我将使用 swift 作为示例)
class TestView: UIView {
@IBOutlet weak var Scroller: UIScrollView!
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let view = super.hitTest(point, with: event)
if (view == self) {
return Scroller
}
return view
}
}
不错!现在你可以看到我们添加了一个滚动条的出口。所以使用界面生成器,select 新视图并在 身份检查器 中将其 class 设置为“TestView
”(或者设置为您将用于您的自定义 class).
设置 class 后,您的视图仍然 selected 转到 connections inspector 并将“Scroller
”连接到您的故事板上的滚动视图。所有连接正确=]
就是这样!!不需要手势识别器!!
新视图会将其所有触摸传递给滚动视图,它的行为就像您在其中平移一样=]
在我的回答中我使用了that answer
编辑: 我现在改进了代码,它没有像以前那样工作,现在它只在需要时捕获,而不是像以前那样在应用程序中进行每次触摸
搜索名为 SwipeGestureRecognizer
的组件:
抓住它并将其放在视图的顶部(使用层次结构确保
你把它放在上面,如果你把它放在另一个元素上,这段代码将不起作用):
Select 层次结构中的 SwipeGestureRecognizer
之一,然后转到其属性页面。更改向右滑动。
- 确保其他识别器具有向左滑动属性
- Select
UIScrollView
并取消选中滚动启用
- 将
detectSwipe()
(参见下面的源代码)连接到两个识别器。
--
@IBAction func detectSwipe (_ sender: UISwipeGestureRecognizer) {
if (currentPage < MAX_PAGE && sender.direction == UISwipeGestureRecognizerDirection.left) {
moveScrollView(direction: 1)
}
if (currentPage > MIN_PAGE && sender.direction == UISwipeGestureRecognizerDirection.right) {
moveScrollView(direction: -1)
}
}
func moveScrollView(direction: Int) {
currentPage = currentPage + direction
let point: CGPoint = CGPoint(x: scrollView.frame.size.width * CGFloat(currentPage), y: 0.0)
scrollView.setContentOffset(point, animated: true)
// Create a animation to increase the actual icon on screen
UIView.animate(withDuration: 0.4) {
self.images[self.currentPage].transform = CGAffineTransform.init(scaleX: 1.4, y: 1.4)
for x in 0 ..< self.images.count {
if (x != self.currentPage) {
self.images[x].transform = CGAffineTransform.identity
}
}
}
}
参考https://github.com/alxsnchez/scrollViewSwipeGestureRecognizer了解更多
我有一个 UIScrollView 可以在向左或向右滑动时工作,但是我已经减小了 scrollView 的大小,所以现在显示区域不会完全占据超级视图的框架,并且滑动只能在滚动视图。
我希望即使在缩小滚动视图的水平边界之外上下滑动时也能垂直滚动。
有人建议我使用手势识别器,但这超出了我目前对 iOS 的熟悉程度,可以使用更具体的建议或更多指导来开始使用。
我没有时间详细回答但是:
在情节提要中,将平移手势识别器拖到滚动视图的超级视图上...将其操作与您的视图控制器连接起来,并在此操作中使用您作为参数获得的手势识别器的属性更改滚动视图位置
提示:在组合框
中连接动作时将参数类型从Any
更改为UIPanGestureRecognizer
请不要将此答案视为在您的问题中使用此方法的建议,我不知道这是否是最好的方法,我只是帮助您尝试一下
有一种更简单的方法,然后使用手势识别器 =]
您可以设置滚动视图的超级视图(更大...)以将触摸传递给滚动视图。它正在工作 M-A-G-I-C-A-L-Y =]
首先,select 将所有触摸传递给滚动视图的视图。如果您的父视图已经可以,您可以使用它。否则你应该考虑添加一个你想要的大小的新视图,它会捕捉到触摸。
现在创建一个新的 class(我将使用 swift 作为示例)
class TestView: UIView {
@IBOutlet weak var Scroller: UIScrollView!
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let view = super.hitTest(point, with: event)
if (view == self) {
return Scroller
}
return view
}
}
不错!现在你可以看到我们添加了一个滚动条的出口。所以使用界面生成器,select 新视图并在 身份检查器 中将其 class 设置为“TestView
”(或者设置为您将用于您的自定义 class).
设置 class 后,您的视图仍然 selected 转到 connections inspector 并将“Scroller
”连接到您的故事板上的滚动视图。所有连接正确=]
就是这样!!不需要手势识别器!! 新视图会将其所有触摸传递给滚动视图,它的行为就像您在其中平移一样=]
在我的回答中我使用了that answer
编辑: 我现在改进了代码,它没有像以前那样工作,现在它只在需要时捕获,而不是像以前那样在应用程序中进行每次触摸
搜索名为
SwipeGestureRecognizer
的组件:抓住它并将其放在视图的顶部(使用层次结构确保 你把它放在上面,如果你把它放在另一个元素上,这段代码将不起作用):
Select 层次结构中的
SwipeGestureRecognizer
之一,然后转到其属性页面。更改向右滑动。
- 确保其他识别器具有向左滑动属性
- Select
UIScrollView
并取消选中滚动启用
- 将
detectSwipe()
(参见下面的源代码)连接到两个识别器。
--
@IBAction func detectSwipe (_ sender: UISwipeGestureRecognizer) {
if (currentPage < MAX_PAGE && sender.direction == UISwipeGestureRecognizerDirection.left) {
moveScrollView(direction: 1)
}
if (currentPage > MIN_PAGE && sender.direction == UISwipeGestureRecognizerDirection.right) {
moveScrollView(direction: -1)
}
}
func moveScrollView(direction: Int) {
currentPage = currentPage + direction
let point: CGPoint = CGPoint(x: scrollView.frame.size.width * CGFloat(currentPage), y: 0.0)
scrollView.setContentOffset(point, animated: true)
// Create a animation to increase the actual icon on screen
UIView.animate(withDuration: 0.4) {
self.images[self.currentPage].transform = CGAffineTransform.init(scaleX: 1.4, y: 1.4)
for x in 0 ..< self.images.count {
if (x != self.currentPage) {
self.images[x].transform = CGAffineTransform.identity
}
}
}
}
参考https://github.com/alxsnchez/scrollViewSwipeGestureRecognizer了解更多