использовать CGAffineTransform
По крайней мере из того, что я наблюдал и тестировал, версия ОС до 4.0 должна определять преобразование,
от OS 4.0 и выше ОС заботится о расположении клавиатуры.
вот почему здесь я проверяю systemVersion перед установкой Transform.
if ([[[UIDevice currentDevice] systemVersion] floatValue] < 4.0) {
CGAffineTransform translate = CGAffineTransformMakeTranslation(xx.0, yy.0);//use x,y values
[self setTransform:translate];
}