我已经实现了一个ViewController,其底部UIView
包含UITextView
,其滚动功能已禁用,可在您输入时调整大小。
当包含的文字高度达到90像素时,我启用滚动 - >
scrollEnabled = YES;
应该发生什么: UITextView
及其superview
应保持为限制的高度(超过90像素限制)。
会发生什么: UITextView
会调整为默认值。
更多信息: 我使用Multiline UITextField的代码作为我的底层视图。 我正在使用iOS7。
感谢任何帮助,谢谢。
编辑:我的代码:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
self.textBox.scrollEnabled = NO;
self.textBox.font = [UIFont fontWithName:@"Helvetica" size:14];
[self registerForKeyboardNotifications];
}
- (void)registerForKeyboardNotifications
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector: @selector(keyPressed:)
name: UITextViewTextDidChangeNotification
object: nil];
}
- (void)keyboardWasShown:(NSNotification *)notification
{
NSDictionary *info = [notification userInfo];
CGSize kbSize = [info[UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
[self setViewMovedUp:YES byHeight:kbSize.height];
}
- (void)keyboardWillHide:(NSNotification *)notification
{
NSDictionary *info = [notification userInfo];
CGSize kbSize = [info[UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
[self setViewMovedUp:NO byHeight:kbSize.height];
}
- (void)keyPressed:(id)sender
{
CGRect textRect = [self.textBox.text boundingRectWithSize:CGSizeMake(255,MAXFLOAT)
options:(NSStringDrawingUsesLineFragmentOrigin)
attributes:@{NSFontAttributeName : [UIFont fontWithName:@"Helvetica" size:14]}
context:nil];
NSInteger newSizeH = textRect.size.height;
if (self.textBox.hasText) {
// if the height of our new chatbox is
// below 90 we can set the height
if (newSizeH <= 90) {
self.textBox.scrollEnabled = NO;
[self.textBox scrollRectToVisible:CGRectMake(0,0,1,1)
animated:NO];
// chatbox
CGRect chatBoxFrame = self.textBox.frame;
chatBoxFrame.size.height = newSizeH + 12;
self.textBox.frame = chatBoxFrame;
// form view
CGRect formFrame = self.commentBox.frame;
formFrame.size.height = 30 + newSizeH;
self.commentBox.frame = formFrame;
}
// if our new height is greater than 90
// sets not set the height or move things
// around and enable scrolling
if (newSizeH > 90) {
self.textBox.scrollEnabled = YES;
CGRect frame = self.textBox.frame;
frame.size.height = 102;
self.textBox.frame = frame;
CGRect formFrame = self.commentBox.frame;
formFrame.size.height = 30 + 90;
self.commentBox.frame = formFrame;
}
}
}
- (void)setViewMovedUp:(BOOL)movedUp byHeight:(CGFloat)height
{
int movement = movedUp ? -height : height;
[UIView animateWithDuration:0.3
animations:^{
self.dataView.frame = CGRectOffset(self.dataView.frame, 0.0, movement);
}];
}
答案 0 :(得分:1)
虽然我有点晚了,但只是因为。 我自己也遇到了同样的问题。滚动时文本视图恢复为原始大小。我解决它的方法是更新UITextView上的高度约束。 这是每次更新UITextView的大小时,您还需要更新相应的约束。
答案 1 :(得分:0)
以下是我在iOS 6和7中使用的代码。
#pragma mark - UITextViewDelegate
- (void)textViewDidChange:(UITextView *)textView {
// I set _maxTextViewHeight based on device, but you can harcode it to 90
CGSize size = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, _maxTextViewHeight)];
float desiredTextViewHeight = size.height - 7.5;
float desiredInputViewHeight = MIN(desiredTextViewHeight + 16.0f, _maxInputViewHeight);
textView.scrollEnabled = (desiredInputViewHeight == _maxInputViewHeight);
NSRange bottom = NSMakeRange([textView.text length] - 1, 1);
[textView scrollRangeToVisible:bottom];
CGRect inputViewFrame = _inputView.frame;
float heightDelta = desiredInputViewHeight - inputViewFrame.size.height;
inputViewFrame.size.height = desiredInputViewHeight;
inputViewFrame.origin.y -= heightDelta;
if (heightDelta != 0) {
[UIView animateWithDuration:0.1 animations:^{
_inputView.frame = inputViewFrame;
} completion:nil];
}
}
您也可以查看此项目https://github.com/jessesquires/MessagesTableViewController