2016-04-22 16 views
0

私は現在、SwiftベースのiPhoneアプリでtextFieldの問題を扱っているキーボードと戦っています。テキストフィールドからテキストフィールドに直接移動するとUITableViewが移動しない

この画像は主要な問題を示す(トップ3の画像が異常を示したが、下の3つは、それがやるべきものです):tableViewCellでのテキストフィールドが編集され

Issue with tableview shifting correctly

は私が移動したいですテーブルビュー全体とナビゲーションバーを上にします。 ... ...

var tableViewShiftedUp = false 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! QuantityTableViewCell 

     let componentLocationQuantity = tableViewData[indexPath.row] 

     if let locationString = componentLocationQuantity.location.valueForKey("location_name") as? String { 
      cell.setCellContents(locationString, quantity: componentLocationQuantity.quantity.floatValue) 
      cell.quantityLabel.delegate = self 
     } 

     //get stock level related to current build rate and lead time (good - green, warning - orange, urgent - red) 
     let status = model.determineStockLevelStatus(component) 
     cell.setQuantityLabelBackgroundStatusColor(status) 

     if editingMode == true { 
      cell.makeQuantityEditable() 
     } 

     //add control event to detect text change 
     cell.quantityLabel.addTarget(self, action: #selector(quantityCellTextChanged(_:)), forControlEvents: UIControlEvents.EditingChanged) 
     cell.quantityLabel.addTarget(self, action: #selector(quantityCellSelected(_:)), forControlEvents: UIControlEvents.EditingDidBegin) 


     return cell 
    } 

//MARK: - UITextfield delegate 
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 
     self.view.endEditing(true) 

     if tableViewShiftedUp == true { 
      moveTable() 
     } 

    } 

    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 
     return true 
    } 

    func quantityCellSelected(textField: UITextField){ 
     if tableViewShiftedUp == false { 
      moveTable() 
     } 
     //check table was moved 
     print(tableView.frame.origin.y) 
    } 

    func hideKeyboard(){ 
     self.view.endEditing(true) 
     if tableViewShiftedUp == true { 
      moveTable() 
     } 
    } 

    func moveTable(){ 
     if tableViewShiftedUp == true { 
      animateTableViewMoving(false, moveValue: 250) 
      animateNavigationBarMoving(false, moveValue: 250) 
      tableViewShiftedUp = false 
     } else { 
      animateTableViewMoving(true, moveValue: 250) 
      animateNavigationBarMoving(true, moveValue: 250) 
      tableViewShiftedUp = true 
     } 
    } 

    // moving the tableView 
    func animateTableViewMoving (up:Bool, moveValue :CGFloat){ 
     let movementDuration:NSTimeInterval = 0.0 
     let movement:CGFloat = (up ? -moveValue : moveValue) 
     UIView.beginAnimations("animateView", context: nil) 
     UIView.setAnimationBeginsFromCurrentState(true) 
     UIView.setAnimationDuration(movementDuration) 
     self.tableView.frame = CGRectOffset(self.tableView.frame, 0, movement) 
     UIView.commitAnimations() 
    } 
    // moving the navigationBar 
    func animateNavigationBarMoving (up:Bool, moveValue :CGFloat){ 
     let movementDuration:NSTimeInterval = 0.0 
     let movement:CGFloat = (up ? -moveValue : moveValue) 
     UIView.beginAnimations("animateView", context: nil) 
     UIView.setAnimationBeginsFromCurrentState(true) 
     UIView.setAnimationDuration(movementDuration) 
     self.midNavigationBar.frame = CGRectOffset(self.midNavigationBar.frame, 0, movement) 
     UIView.commitAnimations() 
    } 

直接移動するときに、それが正常に動作します:私は(ViewControllerをから取ら抜粋)以下のコードでこれを行うことができますtableViewのtextFieldに渡します。しかし、私がすでにtableViewの外でtextFieldを編集しているときに、シフトアップは起こらないので、シフトトグルが同期しなくなります。

私はのtableViewフレームの原点を印刷しました

//check table was moved 
print(tableView.frame.origin.y) 

ので、私はのtableViewがのtableView内部テキストフィールドへのtableView外テキストフィールドからその最初の移動にして上に設定されてものを見ることができ、このプロパティは何ですか私はそれが134になると期待しますが、次回に呼び出されたときに画面に表示される画面はまだ384です。

tableViewでセル内を移動しても問題は発生しません。

私は何らかの競合状態の問題を抱えているように感じます。または、あるセルから次のセルに移行するときにすべてをスローしている一部のデリゲートメソッドが不足しています。

ヘルプは素晴らしいでしょう。

答えて

1

をこのライブラリをチェックアウト:https://github.com/michaeltyson/TPKeyboardAvoiding。 キーボードがテキストフィールドの外に出るように設計されています。

+0

おかげで、最後にIQKeyboardManagerと一緒に行った - 上記のコメントにライブラリ – SimonBarker

+0

UPDATEを探すために考えていなかった:IQKeyboardManagerはかなり右働いていなかったので、TPKeyboardAvoidingを試してみましたが、それは完全にそれはあなたのために働いていた – SimonBarker

+0

グラッドを働きました。何がIQKeyboardManagerで動作していませんでしたか?バグや機能不足はありましたか? – oyalhi

1

あなたが直接あなたがやってようなフレームのサイズを変更することはできません自動レイアウトを使用すると、あなたは制約と協力しなければならないが(あなたが内からあなたのビューにlayoutIfNeededを送った後、IBで作成された制約のIBOutletsを作成したり、新しいものを追加することができますアニメーションブロック)。

あなたは、Appleの公式の指示に従うことができます。

関連する問題