2016-04-14 18 views
1

Ich versuche, die Unterseite einer UItextView ändern Einschränkungen, wenn die Tastatur präsentiert wird, so dass die UItextView wird von TextView "eingeschränkt". Ich habe eine UIView Ich habe Spacer zwischen UItextView und der unteren Layout-Anleitung benannt. Ich versuche, den Wert der Einschränkung für den Abstandhalter zum unteren Rand der Ansicht auf die Tastaturhöhe zu ändern. Jede Hilfe wird geschätzt.Swift: Ändern Sie automatische Layout-Einschränkungen, wenn die Tastatur angezeigt wird

Hier ist mein Code:

@IBOutlet weak var textView: UITextView!  
@IBOutlet weak var spacer: UIView! 
@IBOutlet weak var spacerBottomLayoutConstraint: NSLayoutConstraint! 

in viewDidLoad:

textView.becomeFirstResponder() 

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(AdditionalDetailsVC.keyboardShown(_:)), name: UIKeyboardDidShowNotification, object: nil) 

und wo die Magie passiert:

func keyboardShown(notification: NSNotification) { 

    let info = notification.userInfo! 

    let value: AnyObject = info[UIKeyboardFrameEndUserInfoKey]! 

    let rawFrame = value.CGRectValue 

    keyboardFrame = view.convertRect(rawFrame, fromView: nil) 

    print(keyboardFrame) 

    print(spacerBottomLayoutConstraint) 

    //Setting text field to bottom of keyboard 
    //spacerBottomLayoutConstraint.constant = keyboardFrame.height 

    UIView.animateWithDuration(1, animations: { 

     self.spacerBottomLayoutConstraint.constant = self.keyboardFrame.height 

     self.view.layoutIfNeeded() 
    }) 
} 
+0

Und was ist das Problem? Ich sehe deinen Code und ich sehe dein Ziel, aber ich sehe keine Frage. (Übrigens brauchen Sie nicht zu animieren; Sie erhalten eine automatische Animation zusammen mit der Tastatur.) – matt

+0

Ja matt ist richtig –

+0

Ich möchte, dass die Tastatur den 'UITextView' drückt und den Puffer des' UIView'-Spacers dazwischen hält . Gerade jetzt ist das Textfeld hinter der Tastatur. – Manstof

Antwort

7

persönlich viel einfacher finde ich es den Boden einzustellen Inhaltseinfügung der Textansicht. Dieser Code ist für eine Textansicht, die das gesamte Fenster einnimmt (also unten ist der untere Teil des Bildschirms); eine Textansicht, die nicht nach unten kommen, dass ein wenig mehr elementaren Arithmetik weit erfordern würde:

func keyboardShown(n:NSNotification) { 
    let d = n.userInfo! 
    var r = (d[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue() 
    r = self.textView.convertRect(r, fromView:nil) 
    self.textView.contentInset.bottom = r.size.height 
    self.textView.scrollIndicatorInsets.bottom = r.size.height 
} 
+1

In Swift 3 ist 'CGRectValue()' '' cgRectValue' –

+1

@JasonMoore In Swift 3 können Sie direkt in CGRect umwandeln und den NSValue ganz überspringen. Aktualisierte Version des Codes ist hier: https://github.com/matnteub/Programming-iOS-Book-Examples/blob/master/bk2ch10p522textFieldScrollView/ch23p805textFieldSliding/ViewController.swift – matt

+1

Sweet! Also 'd [UIKeyboardFrameEndUserInfoKey] als! CGRect' für jeden, der darüber stolpert. –

2

können Sie den Code unten versuchen, den Wert der Beschränkung für den Abstandshalter an dem unteren Rand der Ansicht zu ändern die Tastaturhöhe. Setzen Sie den folgenden Code in Ihren ViewController.

// MARK: Keyboard Event Notifications 

func handleKeyboardNotification(notification: NSNotification) { 
    let userInfo = notification.userInfo! 
    print(notification) 
    print(notification.object) 

    // Get information about the animation. 
    let animationDuration: NSTimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).doubleValue 

    let rawAnimationCurveValue = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber).unsignedLongValue 
    let animationCurve = UIViewAnimationOptions(rawValue: rawAnimationCurveValue) 

    // Convert the keyboard frame from screen to view coordinates. 
    let keyboardScreenBeginFrame = (userInfo[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue() 
    let keyboardScreenEndFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as! NSValue).CGRectValue() 

    let keyboardViewBeginFrame = view.convertRect(keyboardScreenBeginFrame, fromView: view.window) 
    let keyboardViewEndFrame = view.convertRect(keyboardScreenEndFrame, fromView: view.window) 
    print(keyboardViewBeginFrame) 
    print(keyboardViewEndFrame) 

    // Determine how far the keyboard has moved up or down. 
    let originDelta = keyboardViewEndFrame.origin.y - keyboardViewBeginFrame.origin.y 
    print(originDelta) 

    // Adjust the table view's scroll indicator and content insets. 
    textView.scrollIndicatorInsets.bottom -= originDelta 
    textView.contentInset.bottom -= originDelta 

    print(keyboardViewEndFrame) 

    spacerBottomLayoutConstraint?.constant = CGFloat(originDelta) 

    // Inform the view that its the layout should be updated. 
    [self.view setNeedsLayout]; 

    // Animate updating the view's layout by calling layoutIfNeeded inside a UIView animation block. 
    let animationOptions: UIViewAnimationOptions = [animationCurve, .BeginFromCurrentState] 
    UIView.animateWithDuration(animationDuration, delay: 0, options: animationOptions, animations: { 
     self.view.layoutIfNeeded() 
     }, completion: nil) 
}