如 iPhone 內應用“信息”的輸入框一樣,輸入文字過多或者輸入換行,輸入框可以隨着內容自動變化。主要是計算內容的尺寸並相應更改輸入框的frame。具體表現在:
- 更改輸入框的 frame.origin.y;
- 更改輸入框的高度。
兩者的變化量是相同的。
為了能達到實時性,就要監聽文字的變化,注冊 UITextViewTextDidChangeNotification 的監聽,並在合適的時候解除監聽。
- (void)willMoveToSuperview:(UIView *)newSuperview { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChanged:) name:UITextViewTextDidChangeNotification object:nil]; } - (void)removeFromSuperview { [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:nil]; }
在監聽的方法中,更改 textView 的frame
- (void)textDidChanged:(NSNotification *)notif { CGSize contentSize = self.textView.contentSize; if (contentSize.height > 140) { return; } CGFloat minus = 3; CGRect selfFrame = self.frame; CGFloat selfHeight = self.textView.superview.frame.origin.y * 2 + contentSize.height - minus + 2 * 2; CGFloat selfOriginY = selfFrame.origin.y - (selfHeight - selfFrame.size.height); selfFrame.origin.y = selfOriginY; selfFrame.size.height = selfHeight; self.frame = selfFrame; }
在本例中,textView 是 self (UIView) 的 subView,並且設置好了 UIViewAutoresizingMask,所以更改 self.frame,變相地更改 textView.frame。
aTextView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;