gpt4 book ai didi

iphone - UITableViewCell 中的 UITextView 平滑自动调整大小显示和隐藏 iPad 上的键盘,但适用于 iPhone

转载 作者:IT王子 更新时间:2023-10-29 08:14:57 25 4
gpt4 key购买 nike

我已经实现了一个自定义的 UITableViewCell,其中包括一个 UITextView,它会随着用户类型自动调整大小,类似于联系人应用程序中的“备注”字段。它在我的 iPhone 上工作正常,但是当我在 iPad 上测试它时,我遇到了一些非常奇怪的行为:当你到达一行的末尾时,键盘隐藏一毫秒然后立即再次显示。我会把它当作一个古怪的错误而注销,但它实际上会导致一些数据丢失,因为如果你正在打字,它会丢失一两个字符。这是我的代码:

代码

// returns the proper height/size for the UITextView based on the string it contains.
// If no string, it assumes a space so that it will always have one line.
- (CGSize)textViewSize:(UITextView*)textView {
float fudgeFactor = 16.0;
CGSize tallerSize = CGSizeMake(textView.frame.size.width-fudgeFactor, kMaxFieldHeight);
NSString *testString = @" ";
if ([textView.text length] > 0) {
testString = textView.text;
}
CGSize stringSize = [testString sizeWithFont:textView.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];
return stringSize;
}

// based on the proper text view size, sets the UITextView's frame
- (void) setTextViewSize:(UITextView*)textView {
CGSize stringSize = [self textViewSize:textView];
if (stringSize.height != textView.frame.size.height) {
[textView setFrame:CGRectMake(textView.frame.origin.x,
textView.frame.origin.y,
textView.frame.size.width,
stringSize.height+10)]; // +10 to allow for the space above the text itself
}
}

// as per: https://stackoverflow.com/questions/3749746/uitextview-in-a-uitableviewcell-smooth-auto-resize
- (void)textViewDidChange:(UITextView *)textView {

[self setTextViewSize:textView]; // set proper text view size
UIView *contentView = textView.superview;
// (1) the padding above and below the UITextView should each be 6px, so UITextView's
// height + 12 should equal the height of the UITableViewCell
// (2) if they are not equal, then update the height of the UITableViewCell
if ((textView.frame.size.height + 12.0f) != contentView.frame.size.height) {
[myTableView beginUpdates];
[myTableView endUpdates];

[contentView setFrame:CGRectMake(0,
0,
contentView.frame.size.width,
(textView.frame.size.height+12.0f))];
}
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
int height;
UITextView *textView = myTextView;
[self setTextViewSize:textView];
height = textView.frame.size.height + 12;
if (height < 44) { // minimum height of 44
height = 44;
[textView setFrame:CGRectMake(textView.frame.origin.x,
textView.frame.origin.y,
textView.frame.size.width,
44-12)];
}
return (CGFloat)height;
}

问题

原来是这样

  1. 此代码在我的 iPhone 和 iPhone 模拟器中 100% 正常运行。当我键入文本时,UITextView 会平稳增长,UITableViewCell 也会随之增长。
  2. 然而,在 iPad 模拟器上,它变得很奇怪。当您在第一行打字时它工作正常,但当您到达一行的末尾时,键盘会消失然后立即重新出现,因此如果用户继续打字,应用程序会漏掉一两个字符。
  3. 以下是一些关于我注意到的奇怪行为的附加注释,可能有助于解释它:
    • 此外,我发现删除行 [myTableView beginUpdates]; [myTableView endUpdates]; 在函数 textViewDidChange:(UITextView *)textView 中使 UITextView 正常增长,也不会显示和隐藏键盘,但不幸的是,UITableViewCell 不会没有长到合适的高度。
    • 更新:关注these instructions ,我现在能够停止文字的奇怪移动;但是键盘还是时隐时现,很奇怪。

有没有人知道如何让键盘在您到达 iPad 行尾时持续显示,而不是隐藏和显示?

P.S.:我对使用 ThreeTwenty 不感兴趣。

最佳答案

你应该返回NO:

 -(BOOL) textViewShouldEndEditing:(UITextView *)textView

如果你想一直显示键盘。您应该通过向此委托(delegate)函数返回 YES 来处理应该隐藏哪个键盘的情况。

编辑:

我进一步挖掘,当 [tableView endUpdates] 调用时,它基本上做了 3 件事:

  1. tableView 上禁用用户交互
  2. 更新单元格变化
  3. tableView 上启用用户交互

SDK(平台)之间的区别在于[UIView setUserInteractionEnabled] 方法。由于 UITableView 不会覆盖 setUserInteractionEnabled 方法,因此它是从 super (UIView) 调用的。

setUserInteractionEnabled 被调用时,iPhone 会寻找一个私有(private)字段 _shouldResignFirstResponderWithInteractionDisabled,它默认返回 NO,因此不会辞去第一响应者 (UITextView)

但在 iPad 上没有这样的检查 AFAIK,因此它在第 1 步 上放弃了 UITextView,并在第 3 步<上设置焦点并使其成为第一响应者/strong>

根据 SDK 文档,textViewShouldEndEditing 基本上是您唯一的选择,它允许您保持专注。

This method is called when the text view is asked to resign the first responder status. This might occur when the user tries to change the editing focus to another control. Before the focus actually changes, however, the text view calls this method to give your delegate a chance to decide whether it should.

关于iphone - UITableViewCell 中的 UITextView 平滑自动调整大小显示和隐藏 iPad 上的键盘,但适用于 iPhone,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4015557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com