2

我想创建一个具有类似 iOS 7 的 Notes 应用程序功能的应用程序。基本上顶部有一排有日期和时间。

我的解决方案是将 UITextView 放在 UITableView 中。第一行是带有日期和时间的 UILabel,第二行是 UITextView。

我根据 UITextView ContentSize 更改了 UITextView 和 UITableViewCell 的高度。

问题是 UITextView 的大小很大,所以当用户点击返回键时它不会自动滚动。

有没有办法让它正常滚动?

4

2 回答 2

1

UITextView是 的子类UIScrollView。我将建议一种实现类似功能的替代方法。添加标签视图作为文本视图的子视图,并设置contentInset标签高度的顶部值。

UILabel* label = [UILabel new];
label.text = @"Test";
[label sizeToFit];

CGRect frame = label.frame;
frame.origin.y -= frame.size.height;
[label setFrame:frame];

[self.textView addSubview:label];

[self.textView setContentInset:UIEdgeInsetsMake(label.frame.size.height, 0, 0, 0)];

示例项目: http ://sdrv.ms/16JUlVD

于 2013-10-04T13:30:36.343 回答
0

试试这个解决方案。修复基于继承。但是 UITextView 文本更改后的任何地方都可以使用逻辑。我从这里获取了一些有用的代码块:

http://craigipedia.blogspot.ru/2013/09/last-lines-of-uitextview-may-scroll.html

并由我编辑为我的解决方案。应该管用。

@interface CustomTextView : UITextView

@end

@implementation CustomTextView

-(id)init {
    self = [super init];
    if (self) {
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textDidChange:) name:UITextViewTextDidChangeNotification object:self];
    }
    return self;
}

-(void)textDidChange:(NSNotification *)notification {

    //iOS 7 UITextView auto scroll fix.
    NSRange caretRange = self.selectedRange;
    if (caretRange.location == self.text.length) {
        CGRect textRect = [self.layoutManager usedRectForTextContainer:self.textContainer];
        CGFloat sizeAdjustment = self.font.lineHeight * [UIScreen mainScreen].scale;

        if (textRect.size.height >= self.frame.size.height - sizeAdjustment) {
            if ([[self.text substringFromIndex:self.text.length - 1] isEqualToString:@"\n"]) {
                [UIView animateWithDuration:0.2 animations:^{
                    [self setContentOffset:CGPointMake(self.contentOffset.x, self.contentOffset.y + sizeAdjustment)];
                }];
            }
        }
    }
    //end of fix
}

@end
于 2014-01-15T17:11:40.023 回答