要使它正常工作的唯一方法是通過第二個文本字段。這個想法是使它成爲一個子視圖,但不可見(由於瘋狂的矩形)。然後,在獲取委託方法的同時,將firstResponder在它和真實文本字段之間來回切換。我創建了一個有人的viewController測試項目,這樣做,(你可以複製粘貼和驗證與約2分鐘的時間特性):
@implementation ViewController
{
UITextField *field;
UITextField *dummyView;
}
- (void)viewDidLoad
{
[super viewDidLoad];
field = [[UITextField alloc] initWithFrame:CGRectMake(0, 460, 320, 20)];
field.borderStyle = UITextBorderStyleRoundedRect;
field.delegate = self;
//field.inputAccessoryView = field;
field.text = @"FOO";
[self.view addSubview:field];
dummyView = [[UITextField alloc] initWithFrame:CGRectMake(0, 40000, 320, 20)];
dummyView.delegate = self;
[self.view addSubview:dummyView];
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
if(textField == field && textField.superview == self.view) {
[field removeFromSuperview];
dummyView.inputAccessoryView = field;
[dummyView becomeFirstResponder];
}
return YES;
}
@end
我要補充,因爲iOS 4的我用船運應用這種技術。
編輯:那麼幾個其他的想法:
1)爲了使故障時,鍵盤開始移動看起來好一點,你可以把你的TextView的快照,並將它放入一個UIImageView,當您從主視圖中刪除textView,將其替換爲UIImageView。現在外觀是一樣的。爲圖像添加一個動畫,以便注意發生了50毫秒,然後alpha變爲0.爲您的真實textview添加一個類似的動畫,以便在50 ms內具有0的alpha值,然後它將變爲1。能夠調整這個過渡是好的(但不是很好)。
2)蘋果可能會這樣做的方式是從鍵盤移動通知中獲取動畫曲線和時間。在這種情況下,他們會首先添加0高度的輔助視圖,併爲textField添加動畫,以便跟蹤鍵盤,但在其上方。兩者同時移動相同的距離。在動畫結束時,將textField拉出self.view,將附件視圖的框改爲具有textField的高度,並將textField作爲附件容器視圖的子視圖放置。這應該工作,但是,它有點複雜。如果你想讓某人爲你的代碼提供100點的獎勵。在結束時,您仍然需要虛擬文本字段來移動textField,因爲當您將其從包含視圖中取出時,它將會退出第一個響應者。最後,您將虛擬場作爲第一響應者,移動文本字段,然後再將真實文本字段作爲第一響應者。
謝謝大衛。我會盡可能地嘗試並更新。令人遺憾的是,蘋果公司並沒有提供更好的方式來做到這一點。 – Ricky
我個人的觀點是,它不是那麼多的代碼,它使用了OSX上經常使用的校長,坦率地說,我還有其他一些缺陷和功能需要他們去處理。我有一個複雜的集合視圖,我不能逐步更新(它崩潰),所以任何更改都必須重新加載它! –
我設法得到這主要與我的UITextViews,但我注意到,UIKeyboard動畫與從屏幕底部inputAccessoryView。所以在很短的時間內,你可以看到另一種觀點。你之前有沒有注意到這個? – Ricky