如何为inputAccessoryView

时间:2015-11-25 04:38:27

标签: ios swift animation

我试图为inputAccessoryView设置动画 - 对于上下文,用例是一旦字段被验证,按钮就应该出现。

我最初尝试将按钮的中心点设置在键盘下方,然后设置动画,但这并不起作用。我也试过改变框架,也没有运气。

然后我发现this SO post似乎描述了我想要实现的目标,选择使用UIView并将按钮添加为子视图。然而,这似乎也无济于事;实际上任何在视图/按钮出现后对其进行的更改都没有被反映出来。

我在输入视图中阅读Apple docs并且它没有明确说明您在初始化后无法对视图进行更改,因此我不确定如果我只是做错了或者没有记录。

这是我的代码的相关部分:

override var inputAccessoryView: UIView! {
  get {
    let height:CGFloat = 50
    let view = UIView(frame: CGRectMake(0, 0, CGRectGetWidth(self.view.frame), height))
    view.backgroundColor = UIColor.redColor()
    view.addSubview(inputButton)
    return view
  }
}

var inputButton: UIButton {
    let height:CGFloat = 50
    let button = UIButton(frame: CGRectMake(0, height, CGRectGetWidth(self.view.frame), 0))
    button.backgroundColor = UIColor.whiteColor()
    button.setTitle("Submit", forState: .Normal)
    button.addTarget(self, action: "didPressButton:", forControlEvents: .TouchUpInside)
    button.center = CGPointMake(CGRectGetMidX(self.view.frame), 50)
    return button
}

// Called on text field change
@IBAction func textFieldValueChanged(sender: AnyObject) {
  inputButton.setTitle("Testing Change!", forState: .Normal)
  textField.reloadInputViews()
  UIView.animateWithDuration(1,
    delay: 0,
    options: .CurveEaseOut,
    animations: {
      self.inputButton.center = CGPointMake(CGRectGetMidX(self.view.frame), -50)
      // self.inputButton.frame = CGRectMake(0, 0, CGRectGetWidth(self.view.frame), -50)
      self.view.setNeedsLayout()
    }, completion: nil)
}

您会注意到我尝试设置标题并实际制作动画。我还使用了setNeedsLayout,甚至在Apple文档中找到了一个名为reloadInputViewslink)的方法,该方法应该在第一个响应者上调用时刷新自定义输入视图。但这一切都无效。

我已经在Thumbtack应用程序中看到了这个动作。所以要么有办法让它工作,要么他们没有使用inputAccessoryViews,这看起来非常糟糕。

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

所以我解决了这个问题。我将属性inputButton更改为常规变量,并将其定义为viewDidLoad,而不是计算属性。我还删除了inputAccessoryView的覆盖,而是创建了一个backgroundView UIView,然后我手动将其指定为textField的inputAccessoryView。这是代码:

var inputButton: UIButton = UIButton(type: .Custom)
var inputBackgroundView: UIView!
let inputButtonHeight:CGFloat = 50

override func viewDidLoad() {
  inputButton.frame = CGRectMake(0, inputButtonHeight, CGRectGetWidth(self.view.frame), inputButtonHeight)
  inputButton.backgroundColor = UIColor(hex: "00BCD4")
  inputButton.titleLabel?.tintColor = UIColor.whiteColor()
  inputButton.setTitle(inputAccessoryTitle, forState: .Normal)
  inputButton.titleLabel?.font = UIFont(name: Font.Medium, size: 10)
  inputButton.addTarget(self, action: "didPressButton:", forControlEvents: .TouchUpInside)
  inputButton.center = CGPointMake(CGRectGetMidX(view.frame), inputButtonHeight * 2)

  inputBackgroundView = UIView(frame: CGRectMake(0, 0, CGRectGetWidth(view.frame), 50))
  inputBackgroundView.backgroundColor = UIColor.clearColor()
  inputBackgroundView.addSubview(inputButton)

  textField.inputAccessoryView = inputBackgroundView
}

然后在验证时激活按钮的中心。

我认为这是我不知道的计算属性的一些问题,它们在技术上是在每次调用时重新计算的函数,尽管我认为这不是问题。