Had this problem. This is definitely a bug in iOS7.X. (You should open a bug report with Apple!). What happens is Apple has bug in its layout calculation and shifts the modally presented view.
We used
dispatch_async(dispatch_get_main_queue(), ^{ [view becomeFirstResponder]; });
to overcome the issue, which is similar to your #3. This delays the keyboard appearance until after the view's layout, overcoming the issue.