2016-12-24 66 views
0

我有一个基类,它处理单元格的一些基本动画。在我的子类中,我已经重写了识别器目标,并且想要做其他一些操作,但翻译总是为0,因为我在基类中调用翻译被重置为.zero覆盖UIPanGestureRecognizer的目标

有没有一种方法可以让我的基类做基本的动画和使用子类来覆盖方法,并做一些其他的东西,如下所示?

我有一个基类:

class Base: UITableViewCell { 

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 

     let gesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) 
     addGestureRecognizer(gesture) 
    } 

    func handlePan(recognizer: UIPanGestureRecognizer) { 
     if recognizer.state == .changed { 
      let translation = recognizer.translation(in: self) 

      ... 

      recognizer.setTranslation(.zero, in: self) 
     } 
    } 
} 

我的子类:

class Sub: Base { 

    override func handlePan(recognizer: UIPanGestureRecognizer) { 
     super.handlePan(recognizer: recognizer) 

     if recognizer.state == .changed { 
      let translation = recognizer.translation(in: self) 

      print(translation.x) // is always 0 

      recognizer.setTranslation(.zero, in: self) 
     } 
    } 
} 

回答

0

在基础类中,你可以打出常见功能集成到一个不同的功能?这样,你就不会需要调用super.handlePan:

class Base: UITableViewCell { 
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) { 
     super.init(style: style, reuseIdentifier: reuseIdentifier) 
     let gesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan)) 
     addGestureRecognizer(gesture) 
    } 

    func handlePan(recognizer: UIPanGestureRecognizer) { 
     if recognizer.state == .changed { 
      let translation = recognizer.translation(in: self) 
      performBaseAnimation(recognizer) 
      recognizer.setTranslation(.zero, in: self) 
     } 
    } 
    func performBaseAnimation(_ recognizer: UIPanGestureRecognizer) { 
     // perform common actions here 
    } 
} 
class Sub: Base { 
    override func handlePan(recognizer: UIPanGestureRecognizer) { 
     super.handleBaseAnimation(recognizer) 
     if recognizer.state == .changed { 
      // perform subclass actions here 
     } 
    } 
} 
+0

的问题仍然是相同的,具有基类调用'recognizer.setTranslation(.zero在:个体经营)'从而防止子类使用'recognizer.translation(in:)'。 –

+0

在我的示例中,由于您已在子类中重写了某些内容,因此不会从子类调用超级视图** let **,而仅调用超级视图。在子类的“超级”调用中找不到它。 – dfd

+0

你说得对。我只是测试它,它的工作原理。谢谢! –