     }
     
     override init(frame: CGRect) {
-        //setup properties later
         
         super.init(frame: frame)
         xibSetUp()
         self.addObserver(self, forKeyPath: "bounds", options: .Initial, context: nil)
+        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillShow), name: UIKeyboardWillShowNotification, object: nil)
         self.textViewDidChange(self.textView)
     }
     
     required init?(coder aDecoder: NSCoder) {
-        //set up properties later
         
         super.init(coder: aDecoder)
         xibSetUp()
+        self.addObserver(self, forKeyPath: "bounds", options: .Initial, context: nil)
+        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(keyboardWillShow), name: UIKeyboardWillShowNotification, object: nil)
         self.textViewDidChange(self.textView)
-        self.addObserver(self, forKeyPath: "bounds", options: .Initial, context: nil)
     }
+    
+    //MARK: custimization methods
     
     func setGutterBackgroundColor(color: UIColor) {
         self.gutterView.backgroundColor = color

        self.textView.font = font
    }
    
    //MARK UITextView Delegate Methods
    
    func textViewDidChange(textView: UITextView) {
        for label in self.gutterSubViews {

        return lineHeight
    }
    
    //MARK: KVO methods
    
    override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
        if keyPath != nil && keyPath == "bounds" && (object?.isEqual(self))! {
