我在视图控制器上有一个textview。文本视图的大小很小,因此很难将手指放在那里并向上或向下滚动。
我真正想要做的是将手指向下并向上拖动,视图向上滚动,向下拖动,视图向下滚动。
我目前正在通过UISwipeGestureRecognizer进行此操作(在视图上有足够的空间)向上滚动每条滑动的一行,如下所示:
func scrollTextUp() {
let currentOffset = textView.contentOffset
let padding : CGFloat = 10
textView.setContentOffset(
CGPoint(
x: currentOffset.x,
y: currentOffset.y - padding < 0 ? 0 : currentOffset.y - padding
),
animated: true
)
}
我认为我需要一个UIPanGestureRecognizer来完成这项工作,但我如何检测上下行动并忽略所有其他指示?
有什么建议吗?
答案 0 :(得分:1)
我的建议是使用touchesMoved并计算触摸的当前位置与触摸的先前位置之间的差异。然后,您可以使用该值更改内容偏移量。注意:您还需要添加保护以防止偏移变得太小或太大。请看下面的一个快速示例,这很快就完成了,所以可能有更好的方法来做某些部分,尤其是确定textview的初始偏移量,但这应该可以帮助你。
class ViewController: UIViewController {
let tv = UITextView()
var originalYOffset: CGFloat = 0
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(tv)
tv.text = "Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text Long text "
tv.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
originalYOffset = tv.contentOffset.y
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let currentLocation = touch.location(in: touch.view)
let previousLocation = touch.previousLocation(in: touch.view)
let amountMoved = previousLocation.y - currentLocation.y
let newOffset = min(max(originalYOffset, tv.contentOffset.y + amountMoved), tv.contentSize.height - tv.frame.size.height)
tv.contentOffset.y = newOffset
}
}
}