То, что вы делаете, пытаясь обнаружить мобильное устройство, слишком близко приближается к концепции IMO «анализ кода браузера». Скорее всего, было бы намного лучше определить некоторые функции. Такие библиотеки, как http://www.modernizr.com/ , могут помочь с этим.
Например, где проходит граница между мобильным и немобильным? С каждым днем оно становится все более размытым.
Вот как ведет себя UITextView согласно инженеру Apple, это предназначено, а UITextView предназначен для текста, который имеет высоту не менее нескольких строк. Здесь нет никакого решения, используйте вместо него UITextField или увеличьте UITextView как минимум до 3 строк в высоту.
UITextView является подклассом UIScrollView, поэтому у него есть настраиваемое свойство contentInset. К сожалению, если вы попытаетесь изменить contentInset в экземпляре UITextView, вставка нижнего края всегда будет сброшена до 32. Я сталкивался с этим раньше с короткими фреймами UITextView и обнаружил, что это проблема. Я подозреваю, что это является причиной вашей проблемы, но вы должны проверить contentInset вашего текстового представления в отладчике.
Обходной путь / решение прост: подкласс UITextView и переопределите метод contentInset, чтобы он всегда возвращал UIEdgeInsetZero. Попробуйте это:
//
// BCTextView
//
// UITextView seems to automatically be resetting the contentInset
// bottom margin to 32.0f, causing strange scroll behavior in our small
// textView. Maybe there is a setting for this, but it seems like odd behavior.
// override contentInset to always be zero.
//
@interface BCZeroEdgeTextView : UITextView
@end
@implementation BCZeroEdgeTextView
- (UIEdgeInsets) contentInset { return UIEdgeInsetsZero; }
@end