tvOS 中的 UIScrollView
UIScrollView in tvOS
我有一个类似于下图中的视图层次结构(蓝色是场景的可见部分):
所以我有一个包含很多元素的 UIScrollView,其中我只显示了两个按钮,因为它们与问题相关。当应用程序为 运行 时,第一个按钮可见,而另一个位于最初可见区域之外。第一个按钮也是 preferredFocusedView。
现在我正在使用 UIFocusGuide 在两个按钮之间改变焦点,这很有效(在 didUpdateFocusInContext:
中检查过)。但是,当 Button2 获得焦点时,我的滚动视图不会向下滚动。
滚动视图固定到超级视图,我在我的视图控制器的 viewDidLoad
中给它适当的内容大小。
关于如何让滚动视图滚动的任何想法?
您需要添加平移手势识别器。我从这里了解到:http://www.theappguruz.com/blog/gesture-recognizer-using-swift。我添加了更多代码以使其不会奇怪地滚动,例如在水平方向。
var currentY : CGFloat = 0 //this saves current Y position
func initializeGestureRecognizer()
{
//For PanGesture Recoginzation
let panGesture: UIPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector("recognizePanGesture:"))
self.scrollView.addGestureRecognizer(panGesture)
}
func recognizePanGesture(sender: UIPanGestureRecognizer)
{
let translate = sender.translationInView(self.view)
var newY = sender.view!.center.y + translate.y
if(newY >= self.view.frame.height - 20) {
newY = sender.view!.center.y //make it not scrolling downwards at the very beginning
}
else if( newY <= 0){
newY = currentY //make it scrolling not too much upwards
}
sender.view!.center = CGPoint(x:sender.view!.center.x,
y:newY)
currentY = newY
sender.setTranslation(CGPointZero, inView: self.view)
}
最后我通过在 viewDidLoad
中将 scrollView.contentSize
设置为适当的大小解决了这个问题。
看看UIScrollView.panGestureRecognizer.allowedTouchTypes
。它是一个 NSNumber
数组,其值基于 UITouchType
或 UITouch.TouchType
(取决于语言版本)。默认情况下 allowedTouchTypes
包含 2 个值 - direct
和 stylus
。这意味着您的 UIScrollView
实例将不会响应来自远程控制的信号。添加以下行来修复它:
Swift 4
self.scrollView.panGestureRecognizer.allowedTouchTypes = [NSNumber(value: UITouchType.indirect.rawValue)]
Swift 4.2 & 5
self.scrollView.panGestureRecognizer.allowedTouchTypes = [NSNumber(value: UITouch.TouchType.indirect.rawValue)]
此外,不要忘记为 UIScrollView
设置正确的 contentSize
:
self.scrollView.contentSize = CGSize(width: 1920.0, height: 2000.0)
我有一个类似于下图中的视图层次结构(蓝色是场景的可见部分):
所以我有一个包含很多元素的 UIScrollView,其中我只显示了两个按钮,因为它们与问题相关。当应用程序为 运行 时,第一个按钮可见,而另一个位于最初可见区域之外。第一个按钮也是 preferredFocusedView。
现在我正在使用 UIFocusGuide 在两个按钮之间改变焦点,这很有效(在 didUpdateFocusInContext:
中检查过)。但是,当 Button2 获得焦点时,我的滚动视图不会向下滚动。
滚动视图固定到超级视图,我在我的视图控制器的 viewDidLoad
中给它适当的内容大小。
关于如何让滚动视图滚动的任何想法?
您需要添加平移手势识别器。我从这里了解到:http://www.theappguruz.com/blog/gesture-recognizer-using-swift。我添加了更多代码以使其不会奇怪地滚动,例如在水平方向。
var currentY : CGFloat = 0 //this saves current Y position
func initializeGestureRecognizer()
{
//For PanGesture Recoginzation
let panGesture: UIPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: Selector("recognizePanGesture:"))
self.scrollView.addGestureRecognizer(panGesture)
}
func recognizePanGesture(sender: UIPanGestureRecognizer)
{
let translate = sender.translationInView(self.view)
var newY = sender.view!.center.y + translate.y
if(newY >= self.view.frame.height - 20) {
newY = sender.view!.center.y //make it not scrolling downwards at the very beginning
}
else if( newY <= 0){
newY = currentY //make it scrolling not too much upwards
}
sender.view!.center = CGPoint(x:sender.view!.center.x,
y:newY)
currentY = newY
sender.setTranslation(CGPointZero, inView: self.view)
}
最后我通过在 viewDidLoad
中将 scrollView.contentSize
设置为适当的大小解决了这个问题。
看看UIScrollView.panGestureRecognizer.allowedTouchTypes
。它是一个 NSNumber
数组,其值基于 UITouchType
或 UITouch.TouchType
(取决于语言版本)。默认情况下 allowedTouchTypes
包含 2 个值 - direct
和 stylus
。这意味着您的 UIScrollView
实例将不会响应来自远程控制的信号。添加以下行来修复它:
Swift 4
self.scrollView.panGestureRecognizer.allowedTouchTypes = [NSNumber(value: UITouchType.indirect.rawValue)]
Swift 4.2 & 5
self.scrollView.panGestureRecognizer.allowedTouchTypes = [NSNumber(value: UITouch.TouchType.indirect.rawValue)]
此外,不要忘记为 UIScrollView
设置正确的 contentSize
:
self.scrollView.contentSize = CGSize(width: 1920.0, height: 2000.0)