子类化 UITextView 时实现 UIScrollView 方法

Posted

技术标签:

【中文标题】子类化 UITextView 时实现 UIScrollView 方法【英文标题】:Implementing UIScrollView Methods when Subclassing UITextView 【发布时间】:2014-05-02 06:54:26 【问题描述】:

我在控制正在使用的 UITextView 中的滚动时遇到问题,因此我选择创建自己的子类。

关于为某些UIScrollView 超类方法提供实现,我有一个非常基本的问题。

这是我的 UITextView 子类的框架代码:

@interface PastedTextView : UITextView
@end

@implementation PastedTextView

- (id)initWithFrame:(CGRect)frame

    self = [super initWithFrame:frame];
    if (self) 
    
    return self;


- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated

    NSLog(@"scrollRectToVisible");


- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated

    NSLog(@"setContentOffset");


- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated

    NSLog(@"zoomToRect");


@end

什么时候会调用那些UIScrollView 方法?仅来自我自己的客户端代码?还是会被框架调用?

更新:

我之所以问这个问题是因为我遇到了以下问题:我正在以编程方式将文本添加到 UITextView(来自粘贴板)。当我这样做时,如果 textview 滚动使得内容的顶部不再可见,则在附加新文本后文本视图会滚动回顶部。

我没有明确触发这个滚动,所以它发生在框架内。

我在 Apple 的文档中没有找到任何描述此行为的内容。所以,我一直在试图找到滚动的来源,这样我就可以避免它......

当这个滚动发生时,上面的方法都不会被调用。顺便说一句,UITextViews scrollRangeToVisible 方法也不是(我尝试将该方法添加到子类实现中)。我不知道为什么会发生隐式滚动回顶部,我想阻止它......

【问题讨论】:

【参考方案1】:

如果您覆盖这些UIScrollView 方法,如图所示,任何调用者(无论是您的代码还是系统的)都将访问您的实现,而不是内置的UIScrollView。如果你想利用系统实现,你可以随时调用 super。

- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated

    [super zoomToRect:rect animated:animated];
    NSLog(@"zoomToRect");

【讨论】:

所以我遇到的问题是:我正在以编程方式将文本添加到UITextView(来自粘贴板)。当我这样做时,如果 textview 滚动使得内容的顶部不再可见,则文本视图在附加新文本后会滚动回顶部。发生这种情况时,不会调用上述任何方法。顺便说一句,UITextViews scrollRangeToVisible 方法也不是(如果我将它添加到子类实现中)。我无法弄清楚为什么会发生隐式滚动回顶部...

以上是关于子类化 UITextView 时实现 UIScrollView 方法的主要内容,如果未能解决你的问题,请参考以下文章

获取没有委托的 UITextView 文本

从故事板本地化归因于UITextView

ios - 带有 UITextView 的 UITapGestureRecognizer

如何判断 UITextView 文本是不是换行?

iOS - 带有 UITextView 的表格视图单元格未正确调整大小

使用 UITextView 的子类和自定义屏幕键盘,调用 textField.textShouldChange