如何根据文本长度增加UITextview高度,如whatsapp

2024-01-08

我已经使用 websocket 在我的 iOS 应用程序中实现了聊天功能,它对我来说工作得很好。

问题是我想增加 UITextView 的高度,而 UITableView 应该根据 UITextView 增加的高度向上移动。谁能帮我?

以下是我在应用程序中使用的代码:

- (void)viewDidAppear:(BOOL)animated
{
    AppDelegate *appDelegate = (AppDelegate *) [[UIApplication sharedApplication]delegate];

    [super viewDidAppear:animated];


    UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
    [self.messagesTextView addGestureRecognizer:tgr];

    [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillChangeFrameNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
        CGRect endFrame = [note.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
        UIViewAnimationCurve curve = [note.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue];
        CGFloat duration = [note.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];

        UIViewAnimationOptions options = curve << 16;

        [UIView animateWithDuration:duration delay:0.0 options:options animations:^{

            NSLog(@"frame: %@", NSStringFromCGRect(endFrame));


            CGRect frame = self.txtView.frame;
            if (isMsgLong==TRUE) {
                frame.origin.y = self.view.frame.size.height- CGRectGetHeight(self.txtView.frame)-216;

            }
            else {

                frame.origin.y = CGRectGetMinY(endFrame) - CGRectGetHeight(self.txtView.frame);
            }
            self.txtView.frame = frame;


            CGRect frame1 = self.sendButton.frame;
            frame1.origin.y = CGRectGetMinY(endFrame) - CGRectGetHeight(self.sendButton.frame);
            self.sendButton.frame = frame1;


            frame = self.messagesTextView.frame;
            frame.size.height = CGRectGetMinY(self.txtView.frame) - CGRectGetMinY(frame);
            self.messagesTextView.frame = frame;

            NSLog(@"did appear: %@", NSStringFromCGRect(self.txtView.frame));

        } completion:nil];
    }];

}

- (void)keyboardWillShow:(NSNotification *)note
{

    [UIView animateWithDuration:0.3 animations:^{
        NSDictionary *info = note.userInfo;
        NSValue *value = info[UIKeyboardFrameEndUserInfoKey];
        CGRect rawFrame = [value CGRectValue];
        CGRect keyboardFrame = [self.view convertRect:rawFrame fromView:nil];

        NSLog(@"frame: %@", NSStringFromCGRect(self.txtView.frame));

        self.txtView.transform = CGAffineTransformMakeTranslation(0, -keyboardFrame.size.height);

        self.sendButton.transform = CGAffineTransformMakeTranslation(0, -keyboardFrame.size.height);
        self.messagesTableView.contentInset=UIEdgeInsetsMake(0, 0,keyboardFrame.size.height,0);
        //keyboardFrame.size.height

        NSLog(@"frame1: %@", NSStringFromCGRect(self.txtView.frame));

        isMsgLong = FALSE;

    }];
}

- (void)keyboardWillHide:(NSNotification *)note
{
    [UIView animateWithDuration:0.3 animations:^{

        NSLog(@"frame2: %@", NSStringFromCGRect(self.txtView.frame));
        self.txtView.transform = CGAffineTransformIdentity;


        NSLog(@"frame3: %@", NSStringFromCGRect(self.txtView.frame));

        self.sendButton.transform = CGAffineTransformIdentity;
        self.messagesTableView.transform = CGAffineTransformIdentity;

        isMsgLong = TRUE;
    }];
}

-(void)textViewDidEndEditing:(UITextView *)textView
{
    self.messagesTableView.contentInset=UIEdgeInsetsMake(0, 0, 0, 0);

    self.txtView.transform = CGAffineTransformMakeTranslation(0, -216);
    self.sendButton.transform = CGAffineTransformMakeTranslation(0, -216);


    NSLog(@"frame5: %@", NSStringFromCGRect(self.txtView.frame));


    NSInteger lastSectionIndex = [self.messagesTableView numberOfSections] - 1;
    NSInteger lastRowIndex = [self.messagesTableView numberOfRowsInSection:lastSectionIndex] - 1;
    if (lastRowIndex==-1) {
        lastRowIndex=0;
    }
    NSIndexPath *pathToLastRow = [NSIndexPath indexPathForRow:lastRowIndex inSection:lastSectionIndex];

    if (lastRowIndex==0) {

    }
    else {
        [self.messagesTableView scrollToRowAtIndexPath:pathToLastRow atScrollPosition:UITableViewScrollPositionBottom animated:NO];
    //UITableViewScrollPositionMiddle
    }
}

这适用于 iOS 6.1 和 iOS 7,如果您使用的是 Objective C,则可以使用以下代码:

- (void)textViewDidChange:(UITextView *)textView
{
    CGFloat fixedWidth = textView.frame.size.width;
    CGSize newSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)];
    CGRect newFrame = textView.frame;
    newFrame.size = CGSizeMake(fmaxf(newSize.width, fixedWidth), newSize.height);
    textView.frame = newFrame;
}

或者,如果您使用 Swift,请使用以下命令:

let fixedWidth = textView.frame.size.width
textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
let newSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat.max))
var newFrame = textView.frame
newFrame.size = CGSize(width: max(newSize.width, fixedWidth), height: newSize.height)
textView.frame = newFrame;

如果您想要支持 iOS 6.1 那么您也应该这样做:

textview.scrollEnabled = NO;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何根据文本长度增加UITextview高度,如whatsapp 的相关文章

随机推荐

  • 撰写:将文本包装在行布局中,而不是将同级文本推出

    我正在尝试 Jetpack Compose 但 Row 的行为让我感到困惑 我在图标按钮旁边有一个文本 我希望图标按钮锚定到最小宽度为 48dp 的一侧 并让文本环绕它 像这样 但文本不会换行 它会占用行中的所有空间 Composable
  • 编写没有语法文件的自定义 Xtext/ANTLR 词法分析器

    我正在为 CoffeeScript 编写一个 Eclipse Xtext 插件 我意识到我可能需要手动为其编写一个词法分析器 CoffeeScript 解析器还使用手写词法分析器 https github com jashkenas cof
  • mod_php 和 cgi php 脚本有什么区别?

    mod php 和 cgi php 脚本有什么区别 我的意思是 为什么最好 是吗 使用 mod php 而不是简单的 php 脚本 并将它们作为 CGI 运行 Thanks 使用 CGI 时 PHP 进程由 Apache 启动 并且是该 P
  • SLComposeViewController 完成处理程序

    您好 如果使用 SLComposeViewController CompletionHandler 完成推文 我如何收到通知 这是发送推文的代码 if SLComposeViewController isAvailableForServic
  • 在没有 IIS 和 VS 2017 的情况下使用 Kestrel

    依赖于微软文档 Kestrel 可以单独使用 也可以与反向代理服务器 例如 IIS Nginx 或 Apache 一起使用 反向代理服务器接收来自 Internet 的 HTTP 请求 并在进行一些初步处理后将它们转发到 Kestrel 如
  • 使用导数和雅可比增强 odeint 类

    我打算在 MCMC 例程中使用 Boost odeint 库来估计 ODE 模型中的参数 由于这些 ODE 可能很僵硬 因此我需要能够将雅可比矩阵与导数一起传递到求解器中 我想创建一个类 其中参数和初始值作为私有成员 然后将导数 雅可比和更
  • 我应该在私有/内部方法中添加空参数吗?

    我正在编写一个库 它具有多个公共类和方法 以及库本身使用的多个私有或内部类和方法 在公共方法中 我有一个空检查和一个抛出 如下所示 public int DoSomething int number if number null throw
  • Java:使用异步编程优化应用程序

    我必须修改 dropwizard 应用程序以提高其运行时间 基本上 该应用程序每天接收大约 300 万个 URL 并下载和解析它们以检测恶意内容 问题是该应用程序只能处理 100 万个 URL 当我查看该应用程序时 我发现它正在进行大量顺序
  • 将文件下载到特定文件夹 python

    我可以从以下位置下载文件URL以下方式 import urllib2 response urllib2 urlopen http www someurl com file pdf html response read 我能想到的一种方法是以
  • 从流中读取数据的最有效方法

    我有一种使用对称加密来加密和解密数据的算法 无论如何 当我要解密时 我有 CryptoStream cs new CryptoStream ms cryptoTransform CryptoStreamMode Read 我必须从 cs C
  • 来自产品 ID 的 MSI 产品代码?

    我正在尝试将 MSI 产品代码 GUID 转换为用于标识 MSI 注册表项中已安装项目的产品代码 ID 有这方面的API吗 如果不是 这该怎么办 Warning Microsoft 强烈建议您不要弄乱他们的 MSI 注册表项 但如果您确实必
  • 如何删除 AWS ECS 任务定义?

    在 Amazon 的 EC2 容器服务中创建任务定义后 如何删除或移除它 It s a 已知问题 https forums aws amazon com thread jspa threadID 170378 一旦取消注册任务定义 它就会进
  • PHP:没有连接的字符串中的变量

    如果我在这个字符串中有一个变量 var echo Hello there are many vars Php 寻找variable vars代替 var 没有连接 如 Hello there are many var s 还有另一种方法可以
  • Jboss不部署战争,JBAS011006

    我需要你的帮助 我正在尝试将 WAR 部署到 Jboss Application Server 7 1 但无法实现 我通过 Web 控制台部署它 它在部署过程中冻结 没有任何错误 这是我的 server log http rghost ru
  • HTML5

    我想知道这是什么意思
  • 更好的说法是 x == Foo::A || x == Foo::B || x == Foo::C || ...?

    假设我有一堆众所周知的价值观 就像这样 但是const char 这只是一个例子 可能更复杂 const char A A B B C C D D E E F F G G 现在假设如果某个表达式的结果位于这些表达式的子集中 我想以特定的方式
  • 简单的 yacc 语法给出错误

    我有一个关于 yacc 编译器的问题 我不编译简单的 yacc 语法 这是代码部分 anbn 0 y token A B start anbn n printf is in anbn 0 n return 0 anbn empty A an
  • before(:each) 与之前

    我是 ruby on Rails 的新手 并进行测试 之间有区别吗 before each do some test code end and before do some test code end The before方法接受一个sco
  • write()-Python 3.x 中的编码字符串

    我有一个 unicode 字符串 我想将其写入文件中 在 Python 2 中我可以这样写 open filename w write s encode utf 8 但这对于 Python 3 来说失败了 显然 s encode 返回 by
  • 如何根据文本长度增加UITextview高度,如whatsapp

    我已经使用 websocket 在我的 iOS 应用程序中实现了聊天功能 它对我来说工作得很好 问题是我想增加 UITextView 的高度 而 UITableView 应该根据 UITextView 增加的高度向上移动 谁能帮我 以下是我