【发布时间】:2016-02-26 10:11:26
【问题描述】:
简而言之,这个问题与在滚动视图中使用平移手势有关。
我有一个画布(它本身是一个 UIView,但尺寸更大),我正在绘制一些 UIView 对象,每个对象都启用了平移手势(我正在谈论的每个小 UIView 对象,正在使用另一个UIView 类)。
现在画布的高度和宽度可以更大...可以根据用户输入进行更改。
为了实现这一点,我将画布放置在 UIScrollView 中。现在画布正在平滑地增加或减少。
画布上那些微小的 UIView 对象也可以旋转。
现在问题来了。
-
如果我没有更改画布大小(静态),即如果它不在滚动视图内,那么画布内的每个 UIView 对象都在移动,并且使用以下代码一切正常。
如果画布在 UIScrollView 内,那么画布可以滚动吗?现在在滚动视图内部,如果我在画布上平移 UIView 对象,那么这些小 UIView 对象不会跟随手指的触摸,而不是在触摸在画布上移动时移动到另一个点。
注意- 不知何故,我发现当任何子视图接触时,我需要禁用滚动视图的滚动。为此,我实现了 NSNotificationCenter 以将信号传递给父 viewController。
这是代码。
这些函数在父viewController类中定义
func canvusScrollDisable(){
print("Scrolling Off")
self.scrollViewForCanvus.scrollEnabled = false
}
func canvusScrollEnable(){
print("Scrolling On")
self.scrollViewForCanvus.scrollEnabled = true
}
override func viewDidLoad() {
super.viewDidLoad()
notificationUpdate.addObserver(self, selector: "canvusScrollEnable", name: "EnableScroll", object: nil)
notificationUpdate.addObserver(self, selector: "canvusScrollDisable", name: "DisableScroll", object: nil)
}
这是画布的 Subview 类
import UIKit
class ViewClassForUIView: UIView {
let notification: NSNotificationCenter = NSNotificationCenter.defaultCenter()
var lastLocation: CGPoint = CGPointMake(0, 0)
var lastOrigin = CGPoint()
var myFrame = CGRect()
var location = CGPoint(x: 0, y: 0)
var degreeOfThisView = CGFloat()
override init(frame: CGRect){
super.init(frame: frame)
let panRecognizer = UIPanGestureRecognizer(target: self, action: "detectPan:")
self.backgroundColor = addTableUpperViewBtnColor
self.multipleTouchEnabled = false
self.exclusiveTouch = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func detectPan(recognizer: UIPanGestureRecognizer){
let translation = recognizer.translationInView(self.superview!)
self.center = CGPointMake(lastLocation.x + translation.x, lastLocation.y + translation.y)
switch(recognizer.state){
case .Began:
break
case .Changed:
break
case .Ended:
notification.postNotificationName("EnableScroll", object: nil)
default: break
}
}
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
notification.postNotificationName("DisableScroll", object: nil)
self.superview?.bringSubviewToFront(self)
lastLocation = self.center
lastOrigin = self.frame.origin
let radians:Double = atan2( Double(self.transform.b), Double(self.transform.a))
self.degreeOfThisView = CGFloat(radians) * (CGFloat(180) / CGFloat(M_PI) )
if self.degreeOfThisView != 0.0{
self.transform = CGAffineTransformIdentity
self.lastOrigin = self.frame.origin
self.transform = CGAffineTransformMakeRotation(CGFloat(M_PI_4))
}
myFrame = self.frame
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
notification.postNotificationName("EnableScroll", object: nil)
}
}
现在,只要 UIView 对象之一在滚动视图内的画布上接收触摸,scrollView 就会完美地禁用其滚动,但有时这些 UIView 对象未正确跟随画布/屏幕上的触摸位置。
我正在使用带有 Xcode 7 的 Swift 2.1,但任何人都可以告诉我我缺少的东西或使用 Objective-c/Swift 的解决方案吗?
【问题讨论】:
-
试试this ?
-
@zcui93 感谢伙伴的帮助...让我尝试让您知道..:)
标签: ios swift uiview uiscrollview