【问题标题】:iOS - Scrolling two UITextViews simultaneouslyiOS - 同时滚动两个 UITextView
【发布时间】:2011-08-31 21:32:33
【问题描述】:

我环顾四周,但找不到任何可以清楚地解释我如何同时滚动两个不可编辑的 UITextView 的东西。我想我可能需要使用scrollRangeToVisiblesetContentOffset,尽管我无法让它们中的任何一个工作。

是否有人有任何示例/示例或文档可以向我指出?

编辑:澄清一下,我希望能够滚动一个 UITextView,并将滚动结果的更改也反映在第二个 UITextView 上。

谢谢!

【问题讨论】:

    标签: iphone objective-c ios ios4 uitextview


    【解决方案1】:

    使用 UIScrollViewDelegate 方法获取有关第一个滚动视图的滚动操作的信息,然后像这样以编程方式滚动第二个:

    - (void) scrollViewDidScroll:(UIScrollView *)view1 {
        scrollView2.contentOffset = view1.contentOffset;
    }
    

    【讨论】:

      【解决方案2】:

      反应在

      - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
      

      并根据scrollView.contentOffset设置对方的scrollViewsetContentVisible

      请注意,UIScrollView 的某些方法即使以编程方式调用也会调用scrollViewDidScroll。这适用于 scrollRangeToVisible 并且会以循环结束,除非您采取措施防止此循环。我认为setContentOffset 或设置scrollView2.contentOffset = CGPointMake(..,..) 不会调用scrollViewDidScroll。但是,我不会用血来签名。准备好看到一个循环并采取措施避免它。 (例如在调用setContentOffset 之前设置布尔实例变量并在scrollViewDidScroll 之后重新设置return;

      【讨论】:

      • 嗯,也许我误解了你的意思,但让我澄清一下我想要实现的目标。我想要发生的是能够滚动一个 UITextView 的内容并让第二个 UITextView 也响应滚动。如果我理解正确的话,我认为使用 UIScrollView 我会滚动它们而不改变它们的内容视图。
      • 好的。我一次给出了两个答案,因为我不确定你想要什么。答案进行了相应编辑。您将不得不使用两个滚动视图。首先,您需要在滚动时做出反应,然后以编程方式将另一个滚动到相同的扩展(偏移)。避免循环。
      【解决方案3】:

      继续前面的答案,为了提供更多信息,我生成了以下代码:

      在界面(.h)中:

      #import <UIKit/UIKit.h>
      
      @interface DoubleTextViewController : UIViewController <UITextViewDelegate>
      
      @property (strong, nonatomic) IBOutlet UITextView *textView1;
      @property (strong, nonatomic) IBOutlet UITextView *textView1;
      
      @end
      

      在您的实施 (.m) 中:

      在定义相应的属性和全局变量后使用这个viewDidLoad函数。

      #import "DoubleTextViewController.h"
      
      #define TEXT_VIEW_1_TAG 1001
      #define TEXT_VIEW_2_TAG 1002
      
      @interface DoubleTextViewController () {
      
          BOOL isScrolling;
      }
      
      @end
      
      @implementation DoubleTextViewController
      
      @synthesize textView1, textView2;
      
      - (void)viewDidLoad {
          [super viewDidLoad];
          // Do any additional setup after loading the view..
      
          isScrolling = NO;
      
          [self.textView1 setTag:TEXT_VIEW_1_TAG];
          [self.textView2 setTag:TEXT_VIEW_2_TAG];
      
          [self.textView1 setDelegate:self];
          [self.textView2 setDelegate:self];
      }
      

      并添加此功能用于同时滚动。

      - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
      
          if (isScrolling) {
              return;
          }
      
      
          isScrolling = YES;
      
          if (scrollView.tag == TEXT_VIEW_1_TAG) {
      
              [self.textView2 setContentOffset:scrollView.contentOffset animated:NO];
      
          } else if (scrollView.tag == TEXT_VIEW_2_TAG) {
      
              [self.textView1 setContentOffset:scrollView.contentOffset animated:NO];
          }
      
          isScrolling = NO;
      }
      

      正如 Hermann Klecker 所提议的,isScrolling 变量会停止滚动循环并使用户体验更好。使用 Fabian Kreiser 提出的代码,一旦用户离开手指,滚动就会停止,这很奇怪。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-14
        • 1970-01-01
        相关资源
        最近更新 更多