我正在尝试创建一个简单的日记应用。在其中我有一个ShowPostTableViewController,我想显示每个帖子。在我的tableView中,我有一个带有两个单元格的部分,一个用于标题,一个用于帖子的主体。标题位于UITextField内部,正文位于UITextView内。我声明这两个:
UITextField * postHeadline;
UITextView * postText;
我在我的实现文件中合成它们。我在willDisplayCell方法中设置tableView的单元格。它看起来像这样:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell
forRowAtIndexPath:(NSIndexPath *)indexPath {
tableView.allowsSelection = NO;
CGRect wholeWindow = [self.view bounds];
float headlineHeight = 40;
CGRect headlineRect = CGRectMake(10, 10, wholeWindow.size.width, headlineHeight);
CGRect bodyRect = CGRectMake(wholeWindow.origin.y, wholeWindow.origin.x,
wholeWindow.size.width, wholeWindow.size.height);
postHeadline = [[UITextField alloc] initWithFrame:headlineRect];
postText = [[UITextView alloc] initWithFrame:bodyRect];
NSString * headline = [[NSString alloc] initWithFormat:@"%@",[currentPostArray
objectAtIndex:0]];
NSString * body = [[NSString alloc] initWithFormat:@"%@",[currentPostArray
objectAtIndex:1]];
postHeadline.text = headline;
postHeadline.font = [UIFont fontWithName:@"Helvetica-Bold" size:24.0];
postText.text = body;
postText.backgroundColor = [UIColor colorWithRed:254.0/255.0 green:255.0/255.0
blue:237.0/255.0 alpha:1];
postText.font = [UIFont fontWithName:@"Georgia" size:17.0];
postText.scrollEnabled = NO;
postText.delegate = self;
if (indexPath.row == 0) {
[cell.contentView addSubview:postHeadline];
}
if (indexPath.row == 1) {
[cell.contentView addSubview:postText];
CGRect frame = postText.frame;
frame.size.height = postText.contentSize.height;
postText.frame = frame;
}
}
是的,我是初学者,可能会像疯了一样泄露记忆。与此相关的问题。看起来我的UITextField postHeadline设置了两次,我无法删除它,因为它是同一文本的两层。我怎么解决这个问题?
回到我原来的问题。我的cellForRowAtIndexPath完好无损。我已经为我的UITextView配置了委托方法(认为这就是问题所在)。我找到了一个几乎可以在这里工作的解决方案:UITextView change height instead of scroll。
他们看起来像这样:
- (void)textViewDidBeginEditing:(UITextView *)textView
{
textView.frame =CGRectMake(textView.frame.origin.x,textView.frame.origin.y,textView.
frame.size.width,textView.frame.size.height + 100);
}
此方法应调整textView:
的大小- (void)textViewDidChange:(UITextView *)textView
{
CGFloat fontHeight = (textView.font.ascender - textView.font.descender) + 1;
CGRect newTextFrame = textView.frame;
newTextFrame.size = textView.contentSize;
newTextFrame.size.height = newTextFrame.size.height + fontHeight;
textView.frame = newTextFrame;
}
我像这样设置行高:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath
*)indexPath
{
NSString * body = [[NSString alloc] initWithFormat:@"%@",[currentPostArray
objectAtIndex:1]];
CGSize bodySize = [body sizeWithFont:[UIFont fontWithName:@"Georgia" size:17.0]
constrainedToSize:CGSizeMake(self.view.frame.size.width,CGFLOAT_MAX)];
if (indexPath.section == 0 && indexPath.row == 1) {
return bodySize.height + 100;
}
return 50;
}
这件事几乎可行。当用户点击返回时,textview似乎会扩展,但它只能工作14次,然后光标隐藏在键盘后面。
如何解决这个问题的任何想法和提示都会很棒!
由于 //安德斯
修改
我通过将大部分willDisplayCell方法代码移动到viewDidLoad方法解决了“标题设置两次”的问题。而且我认为我已经将本地化的问题放在了哪里。我认为这是我的heightForRowAtIndexPath方法。它目前看起来像这样:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath
*)indexPath
{
NSString * body = [[NSString alloc] initWithFormat:@"%@",[currentPostArray
objectAtIndex:1]];
CGSize bodySize = [body sizeWithFont:[UIFont fontWithName:@"Georgia" size:17.0]
constrainedToSize:CGSizeMake(self.view.frame.size.width,CGFLOAT_MAX)];
if (indexPath.section == 0 && indexPath.row == 1) {
return bodySize.height + 100;
}
return 50;
}
由于数组及其内容在viewDidLoad方法中设置,因此大小保持不变。因此,我认为我需要在TextView的内容之后动态增加单元格的大小。因为当我写这样的时候:
if (indexPath.section == 0 && indexPath.row == 1) {
return 1000;
}
单元格的大小增加,用户可以在键盘进入之前更多次点击“返回”。有没有办法动态增加细胞的高度?
答案 0 :(得分:1)
认为我解决了它。这些方法做了神奇的伎俩:
[self.tableView beginUpdates];
[self.tableView endUpdates];
我更新了我的heightForRowAtIndexPath,所以它看起来像这样:
if (indexPath.section == 0 && indexPath.row == 1) {
return postText.frame.size.height + headlineHeight;
}
return 44;
我将这些方法添加到viewDidChange和viewWillAppear(重置大小)。
[self.tableView beginUpdates];
[self.tableView endUpdates];
这就是它。