保存 UIViewSubclass 的 Y 位置没有成员命名错误
Saving Y position of UIViewSubclass Does not Have member Named Error
我正在尝试保存 UIView
subclass 的位置,它通过 pan gesture recogniser
移动并且需要留在那个位置
UIView 子classMoveSection
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
var panGesture = UIPanGestureRecognizer(target: self, action:Selector("reposition:"))
self.addGestureRecognizer(panGesture)
let yPosition = self.frame.origin.y
}
func reposition(recognizer: UIPanGestureRecognizer) {
let translation = recognizer.translationInView(self)
if let view = recognizer.view { view.center = CGPoint(x:view.center.x + translation.x, y:view.center.y + translation.y)
}
recognizer.setTranslation(CGPointZero, inView: self)
if recognizer.state == UIGestureRecognizerState.Ended {
//Center view
self.center.x = self.bounds.width/2
}
}
保存位置 class
class ViewController
@IBOutlet var reorderSectionOne: MoveSection!
let positionDefaults = NSUserDefaults()
positionDefaults.setObject(NSStringFromCGPoint(self.reorderSectionOne.yPosition), forKey: "pointPositionSectionOne")
positionDefaults.synchronize()
错误:没有名为 yPosition 的成员
您需要将 yPosition
的声明从 init(coder:)
内部移动到 UIView
subclass 内部。此外,yPosition
是 CGFloat
,而不是 CGPoint
。所以我使用了一个不同的实例变量,称为 savedCenter
,将位置保存为实际的 CGPoint
。我重构了您的代码并实施了以下更改。
class MoveableView: UIView {
var savedYPosition: CGFloat!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let panRecognizer = UIPanGestureRecognizer(target: self, action:"reposition:")
self.addGestureRecognizer(panRecognizer)
self.savedYPosition = CGRectGetMinY(self.frame)
}
func reposition(recognizer: UIPanGestureRecognizer) {
let translation = recognizer.translationInView(self)
if let view = recognizer.view {
view.center = CGPointMake(view.center.x + translation.x, view.center.y + translation.y)
}
recognizer.setTranslation(CGPointZero, inView: self)
if recognizer.state == .Ended {
// center view
self.center.x = CGRectGetWidth(self.bounds) / 2.0
}
}
}
然后你会在你的 ViewController
class
func savePosition() {
let defaults = NSUserDefaults()
defaults.setFloat(Float(self.reorderSectionOne.savedYPosition), forKey: "yPositionSectionOne")
defaults.synchronize()
}
请注意,我假设您的 UIView
subclass 被命名为 MoveableView
。
我正在尝试保存 UIView
subclass 的位置,它通过 pan gesture recogniser
移动并且需要留在那个位置
UIView 子classMoveSection
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
var panGesture = UIPanGestureRecognizer(target: self, action:Selector("reposition:"))
self.addGestureRecognizer(panGesture)
let yPosition = self.frame.origin.y
}
func reposition(recognizer: UIPanGestureRecognizer) {
let translation = recognizer.translationInView(self)
if let view = recognizer.view { view.center = CGPoint(x:view.center.x + translation.x, y:view.center.y + translation.y)
}
recognizer.setTranslation(CGPointZero, inView: self)
if recognizer.state == UIGestureRecognizerState.Ended {
//Center view
self.center.x = self.bounds.width/2
}
}
保存位置 class
class ViewController
@IBOutlet var reorderSectionOne: MoveSection!
let positionDefaults = NSUserDefaults()
positionDefaults.setObject(NSStringFromCGPoint(self.reorderSectionOne.yPosition), forKey: "pointPositionSectionOne")
positionDefaults.synchronize()
错误:没有名为 yPosition 的成员
您需要将 yPosition
的声明从 init(coder:)
内部移动到 UIView
subclass 内部。此外,yPosition
是 CGFloat
,而不是 CGPoint
。所以我使用了一个不同的实例变量,称为 savedCenter
,将位置保存为实际的 CGPoint
。我重构了您的代码并实施了以下更改。
class MoveableView: UIView {
var savedYPosition: CGFloat!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let panRecognizer = UIPanGestureRecognizer(target: self, action:"reposition:")
self.addGestureRecognizer(panRecognizer)
self.savedYPosition = CGRectGetMinY(self.frame)
}
func reposition(recognizer: UIPanGestureRecognizer) {
let translation = recognizer.translationInView(self)
if let view = recognizer.view {
view.center = CGPointMake(view.center.x + translation.x, view.center.y + translation.y)
}
recognizer.setTranslation(CGPointZero, inView: self)
if recognizer.state == .Ended {
// center view
self.center.x = CGRectGetWidth(self.bounds) / 2.0
}
}
}
然后你会在你的 ViewController
class
func savePosition() {
let defaults = NSUserDefaults()
defaults.setFloat(Float(self.reorderSectionOne.savedYPosition), forKey: "yPositionSectionOne")
defaults.synchronize()
}
请注意,我假设您的 UIView
subclass 被命名为 MoveableView
。