未调用 UIScrollViewDelegate 函数
Posted
技术标签:
【中文标题】未调用 UIScrollViewDelegate 函数【英文标题】:UIScrollViewDelegate functions not called 【发布时间】:2015-02-24 08:30:43 【问题描述】:当我拖动它时,我的视图似乎在滚动(侧栏出现并四处移动),但我的委托函数没有触发。 问题:为什么不调用协议函数中的 println? 作为背景,我试图在 Swift 中重写 https://github.com/bobmoff/ScrollKit,这就是 UIView 与 SKView 等混合的原因.
我的日志输出是:
852.0480.0完成viewDidLoad
代码是:
import UIKit
import SpriteKit
var kViewTransformChanged = "view transform changed"
var scene = GameScene()
var skView = SKView()
var clearContentView = UIView()
extension SKNode
class func unarchiveFromFile(file : NSString) -> SKNode?
if let path = NSBundle.mainBundle().pathForResource(file, ofType: "sks")
var sceneData = NSData(contentsOfFile: path, options: .DataReadingMappedIfSafe, error: nil)!
var archiver = NSKeyedUnarchiver(forReadingWithData: sceneData)
archiver.setClass(self.classForKeyedUnarchiver(), forClassName: "SKScene")
let scene = archiver.decodeObjectForKey(NSKeyedArchiveRootObjectKey) as GameScene
archiver.finishDecoding()
return scene
else
return nil
class GameViewController: UIViewController, UIScrollViewDelegate
override func viewDidLoad()
super.viewDidLoad()
// Configure the view.
skView = self.view as SKView
skView.showsFPS = true
skView.showsNodeCount = true
/* Sprite Kit applies additional optimizations to improve rendering performance */
skView.ignoresSiblingOrder = true
/* Set the scale mode to scale to fit the window */
scene.scaleMode = .AspectFill
skView.presentScene(scene)
var contentSize = skView.bounds.size
contentSize.height *= 1.5
contentSize.width *= 1.5
scene.size = contentSize
println(contentSize.height)
println(contentSize.width)
var scrollView = UIScrollView()
scrollView.frame = skView.frame
scrollView.contentSize = contentSize
scrollView.delegate = self
scrollView.maximumZoomScale = 3
scrollView.minimumZoomScale = 1
scrollView.indicatorStyle = UIScrollViewIndicatorStyle.White
clearContentView.frame = CGRect(origin: CGPointZero, size: contentSize)
clearContentView.backgroundColor = UIColor.clearColor()
scrollView.addSubview(clearContentView)
clearContentView.addObserver(self, forKeyPath: "transform", options: NSKeyValueObservingOptions(), context: &kViewTransformChanged)
skView.addSubview(scrollView)
//
println("Finished viewDidLoad")
func viewForZoomingInScrollView() -> UIView?
println("entering viewForZoomingInScrollView function")
return self.view
func scrollViewDidScroll()
println("entering scrollViewDidScroll function")
adjustContent()
// NOT SURE ABOUT THIS FUNCTION
func adjustContent()
println("entering adjustContent function")
NSLog("?")
var scrollV = self.view as UIScrollView
scene.setScale(scrollV.zoomScale)
scene.position = scrollV.contentOffset
func scrollViewDidZoom()
println("entering scrollViewDidZoom function")
adjustContent()
func scrollViewDidTransform()
println("entering scrollViewDidTransform function")
adjustContent()
func scrollViewDidEndZooming()
println("entering scrollViewDidEndZooming function")
adjustContent()
override func shouldAutorotate() -> Bool
return true
override func supportedInterfaceOrientations() -> Int
if UIDevice.currentDevice().userInterfaceIdiom == .Phone
return Int(UIInterfaceOrientationMask.AllButUpsideDown.rawValue)
else
return Int(UIInterfaceOrientationMask.All.rawValue)
override func didReceiveMemoryWarning()
super.didReceiveMemoryWarning()
// Release any cached data, images, etc that aren't in use.
override func prefersStatusBarHidden() -> Bool
return true
【问题讨论】:
【参考方案1】:您的UIScrollViewDelegate
函数实现与the documentation 中的声明不匹配。具体来说,您缺少 UIScrollView
参数。
例如,这个:
func scrollViewDidScroll()
println("entering scrollViewDidScroll function")
adjustContent()
应该是:
func scrollViewDidScroll(scrollView: UIScrollView)
println("entering scrollViewDidScroll function")
adjustContent()
【讨论】:
以上是关于未调用 UIScrollViewDelegate 函数的主要内容,如果未能解决你的问题,请参考以下文章
iOS 设计中关于UIScrollViewDelegate的几个代理方法的简单介绍