当光标到达下一行时,如何通过一行大小移动UITextView的子视图?

时间:2014-06-28 17:44:22

标签: ios objective-c uitextview

screenshot of app
我有一个textView,我在这个textView中添加了一个图像。当我写文字并转到下一行时,我想将此图像向下移动一行的大小。类似于在Twitter应用程序中创建带图片的推文时。在这段代码中,我可以逐行移动,但我的问题是它转移到了较晚(仅在下一行的第二个符号)。我试图在CGSizeMake中使用不同的值,但是线路过早或过晚..任何建议?

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range
replacementText:(NSString *)text
{

    CGSize constrainedSize = CGSizeMake(self.textView.contentSize.width, self.textView.contentSize.height);
    UIFont *fontText = [UIFont systemFontOfSize:17];

    CGRect textRect = [textView.text boundingRectWithSize:constrainedSize
                                         options:NSStringDrawingUsesLineFragmentOrigin
                                      attributes:@{NSFontAttributeName:fontText}
                                         context:nil];

    size = textRect.size;

    CGFloat height = ceilf(size.height);
    CGFloat width  = ceilf(size.width);

    CGRect frame = CGRectMake(0.0f, height+50, 100.0f, 100);
    _imageView.frame=frame;

    return YES;
}

2 个答案:

答案 0 :(得分:0)

您正在硬编码字体大小。也许文本字段有不同的字体。请改用textField.font

此外,您应该简化代码并消除未使用的变量,例如width

最后,您应该设置一个断点来计算大小并继续检查它是否正确。基于此,它应该很容易调试。

另请注意,textField.text尚未包含要添加的文字。在检查大小之前,您必须先自己构造新生成的字符串。

NSString *newText = [textField.text 
    stringByReplacingCharactersInRange:range withString:text];

答案 1 :(得分:0)

我认为您应该将Image subview添加到superview的{​​{1}}。 textView符合shouldChangeTextInRange: textView content textView的{​​{1}}框架。 当textView的框架发生变化时,只需使用 KVO 进行捕获。所以,现在你可以在textview的底部边框上保留图像的顶部边框,甚至是动画!

我不会代替你编写代码,但这听起来非常简单有趣,对吧?