2015-11-25 3 views
2

Я пытаюсь анимировать inputAccessoryView - для контекста прецедент - это когда поля проверяются, кнопка должна появиться.Как анимировать 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

Так что я решил проблему. Я изменил свойство inputButton на обычную переменную и определил ее в viewDidLoad в отличие от вычисленного свойства. Я также удалил переопределение inputAccessoryView и вместо этого сделал backgroundView UIView, который затем назначался вручную как 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 
} 

А затем просто анимированный центр кнопки при проверке.

Я полагаю, что это некоторая проблема с вычисленными свойствами, о которых я не знаю, они технически функционируют, которые пересчитываются при каждом вызове, хотя я и не думал, что это будет проблемой.

Смежные вопросы