There are delegate methods that allow you to capture the actual keystrokes as they come in.
Implement the below delegate method to resign first responder, based upon the keyboard
-(BOOL)textFieldShouldReturn:(UITextField *)textfield
Implement the below delegate method to detect when focus has been given back to the TextField. You may also want to perform the deletion of current text, or retain the text that was already there if you wish
-(void)textFieldDidBeginEditing:(UITextField *)textfield
Implement the below delegate method to detect the character(s) entered and where (based on the caret position), and essentially add the characters to your privately held and displayed string (displayed out to your textfield that is)
-(BOOL)textView:(NSTextView *)aTextView shouldChangeTextInRange:(NSRange)affectedCharRange replacementString:(NSString *)replacementString
Implement the below delegate method to detect when editing has finished so that you can perform any other cleanup etc... that you wish to do.
-(void)textFieldDidEndEditing:(UITextField *)textField
I will get back to you on the dynamic sizing of your TextView itself, but that (at least on iOS) as Ive seen has a solution and at one point I have used it. You will essentially make your font size static, potentially your width static, then edit your height based on how many lines you have, or you could keep your height static, and change your width based on characters, etc... up to you.
Here is a great set of responses on StackOverflow about dynamic sizing
How do I size a UITextView to its content?
So if you combine the keystroke recognition with the dynamic sizing you should have it!!!