我试图为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文档中找到了一个名为reloadInputViews
(link)的方法,该方法应该在第一个响应者上调用时刷新自定义输入视图。但这一切都无效。
我已经在Thumbtack应用程序中看到了这个动作。所以要么有办法让它工作,要么他们没有使用inputAccessoryViews,这看起来非常糟糕。
感谢任何帮助!
答案 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
}
然后在验证时激活按钮的中心。
我认为这是我不知道的计算属性的一些问题,它们在技术上是在每次调用时重新计算的函数,尽管我认为这不是问题。