我的代码根据文字动态调整。按Enter键的话增加高度 除非我们按下返回,否则会增加宽度。
但我该怎么做呢
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
CGFloat height = [textView.text sizeWithFont:textView.font].height;
CGFloat width = [textView.text sizeWithFont:textView.font].width;
if ([[NSCharacterSet newlineCharacterSet] characterIsMember:[text characterAtIndex:text.length-1]])
{
self.textViewHeight += height;
[textView setFrame:CGRectMake(self.contentView.frame.origin.x, self.contentView.frame.origin.y, width, self.textViewHeight)];
self.contentView.frame = textView.frame;
self.frame = textView.frame;
[_editButton setFrame:CGRectMake(self.contentView.frame.size.width - 14, 0, 28, 28)];
}
else{
int charsAsInt = (int)(textView.text.length);
CGFloat charWidth = width / charsAsInt;
[textView setFrame:CGRectMake(self.contentView.frame.origin.x, self.contentView.frame.origin.y, width+ charWidth, self.textViewHeight)];
self.contentView.frame = textView.frame;
self.frame = textView.frame;
[_editButton setFrame:CGRectMake(self.contentView.frame.size.width - 14, 0, 28, 28)];
}
但即使按回车也会增加宽度。如何防止这种情况。
答案 0 :(得分:3)
确定宽度是所有行中整个文本的宽度。所以必须找到最大线长度。
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
CGFloat height = [textView.text sizeWithFont:textView.font].height;
//CGFloat lineWidth;
int charsAsInt;
if ([[NSCharacterSet newlineCharacterSet] characterIsMember:[text characterAtIndex:text.length-1]])
{
self.lineWidth = 0;
newLine = @"";
self.textViewHeight += height;
NSLog(@"height: %f, width: %f, new Height: %f", height, self.textViewWidth, self.textViewHeight);
[textView setFrame:CGRectMake(self.contentView.frame.origin.x, self.contentView.frame.origin.y, self.textViewWidth, self.textViewHeight)];
self.contentView.frame = textView.frame;
self.frame = textView.frame;
[_editButton setFrame:CGRectMake(self.contentView.frame.size.width - 14, 0, 28, 28)];
[super setFrame:textView.frame];
}
else{
newLine = [newLine stringByAppendingString:text];
self.lineWidth = [newLine sizeWithFont:textView.font].width;
charsAsInt = (int)(newLine.length);
CGFloat charWidth = self.lineWidth / charsAsInt;
if(self.lineWidth >= self.textViewWidth){
self.textViewWidth = self.lineWidth;
[textView setFrame:CGRectMake(self.contentView.frame.origin.x, self.contentView.frame.origin.y, self.lineWidth, self.textViewHeight)];
}
else{
[textView setFrame:CGRectMake(self.contentView.frame.origin.x, self.contentView.frame.origin.y, self.textViewWidth, self.textViewHeight)];
}
self.contentView.frame = textView.frame;
self.frame = textView.frame;
[_editButton setFrame:CGRectMake(self.contentView.frame.size.width - 14, 0, 28, 28)];
//[super setContentView:self.contentView];
[super setFrame:textView.frame];
}
return YES;
}
发生的事情是我们有一个多行的UITextView Sticker,所以当你按下键盘上的return时,你会有一个新行。现在我将其存储在一个新变量中。只有当新行的宽度大于旧行的宽度(self.textViewWidth
)时,整个textVIew的宽度才会增加