UITextView scrollEnabled = YES 在 iOS8 中设置 scrollEnabled = NO 后不起作用

Posted

技术标签:

【中文标题】UITextView scrollEnabled = YES 在 iOS8 中设置 scrollEnabled = NO 后不起作用【英文标题】:UITextView scrollEnabled = YES not working after set scrollEnabled = NO in iOS8 【发布时间】:2016-05-11 03:13:45 【问题描述】:

我创建了一个演示来检查UITextView scrollEnabled。 它只包含 1 个UITextView 和 2 个按钮启用和禁用滚动

我在模拟器和设备 ios 8 上测试,如果我单击禁用滚动按钮,UITextView 将正确禁用滚动,但之后我 点击启用滚动,UITextView 不会启用滚动

但是,我在 iOS9 设备上测试,启用和禁用滚动效果很好。

#import "ViewController.h"

@interface ViewController ()

    @property (weak, nonatomic) IBOutlet UITextView *myTextView;

@end

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];


- (IBAction)enableScrollButtonPressed:(id)sender
    self.myTextView.scrollEnabled = YES;


- (IBAction)disableScrollButtonPressed:(id)sender
    self.myTextView.scrollEnabled = NO;


@end

有解决这个问题的办法吗?如果有人不明白我的解释,请检查 my demo project 任何帮助或建议将不胜感激

【问题讨论】:

在模拟器或设备中 @PKT 在模拟器和设备中 我试过你的代码文本视图在你改变方向之前不会滚动 问题在于自动布局,我固定了 textview 的高度,现在可以滚动 @PKT 我尝试使用自动布局固定文本视图的高度。但是我的文本视图在我点击禁用然后启用滚动后仍然无法滚动:( 【参考方案1】:

问题是在 iOS 8 中,更改 scrollEnabled 时 contentSize 没有正确调整。对您的 enableScrollButtonPressed 方法稍作调整即可成功解决该问题。

-(IBAction)enableScrollButtonPressed:(id)sender

    self.myTextView.scrollEnabled = YES;
    self.myTextView.contentSize = [self.myTextView sizeThatFits:self.myTextView.frame.size];

【讨论】:

看起来这可能会回到 iOS 12 中......至少,这对我来说解决了一个非常相似的问题【参考方案2】:

是的,你是对的,禁用和启用 textview 的滚动在 iOS8 中不起作用,它可能是一个错误或其他任何问题,顺其自然。 我们可以通过更改 textview 的 ContentSize 来禁用或启用文本视图的滚动。

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UITextView *myTextView;

@end

 @implementation ViewController
-(IBAction)enableScrollButtonPressed:(id)sender
    CGSize scrollableSize = CGSizeMake(self.myTextView.bounds.size.width+20, self.myTextView.bounds.size.height+20);
    [self.myTextView setContentSize:scrollableSize];


-(IBAction)disableScrollButtonPressed:(id)sender
    [self.myTextView setContentOffset:CGPointMake(0, 0)];
    [self performSelector:@selector(StopScroll) withObject:nil afterDelay:0.1];


-(void)StopScroll
    CGSize scrollableSize = CGSizeMake(self.myTextView.bounds.size.width, self.myTextView.bounds.size.height/2);
    [self.myTextView setContentSize:scrollableSize];


@end

我已经测试了上面的代码,我正在使用 xcode 7.2.1iOS 8.3。试一试,让我知道结果

【讨论】:

感谢您的努力。这个解决方案运作良好。但是,您能检查一下@Brett Donald 的答案,会更好吗? Welcome Phan,我在您的演示项目中尝试了 brett donald 的代码,有些奇怪。试试下面的场景 1.一旦您的应用运行,将文本视图滚动到顶部,然后禁用滚动并再次启用它是否有效为你 ?。 2.有时点击启用按钮两次会改变textview框架。【参考方案3】:

经过几个小时的搜索,我找到了一种方法

-(IBAction)enableScrollButtonPressed:(id)sender
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
    self.myTextView.scrollEnabled = YES;
    [self.myTextView setText:self.myTextView.text];

    self.myTextView.layoutManager.allowsNonContiguousLayout = false;

);



-(IBAction)disableScrollButtonPressed:(id)sender

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^
    self.myTextView.scrollEnabled = NO;
);


条件是你需要先滚动然后才能完美运行

意味着当点击禁用滚动按钮时,文本视图应该在某个位置滚动不能在默认位置

【讨论】:

非常感谢您的努力。此解决方案有效,但在禁用然后启用滚动后它将更改 TextView 的文本大小。我认为@Brett Donald 给出的解决方案更好。你这么认为吗?【参考方案4】:
Please follow below steps simply
self.myTextView.scrollEnabled = NO;
self.myTextView.userInteractionEnabled = YES;
self.myTextView.scrollEnabled = YES;

【讨论】:

【参考方案5】:

在视图中启用或禁用滚动视图后,您需要布局视图。

使用 viewWillLayoutSubviews/layoutIfNeeded 方法。

【讨论】:

我已经使用了 layoutIfNeeded 和 viewWillLayoutSubviews 但它仍然无法正常工作。也许我使用的方式是错误的。你能帮我写代码吗,或者请检查我的演示项目【参考方案6】:

如下更改您的属性。

在你的代码中..

@property (weak, nonatomic) IBOutlet UITextView *myTextView;

改变属性属性如下:

@property (strong, nonatomic) IBOutlet UITextView *myTextView;

然后它会正常工作。我查过了。

【讨论】:

哦..让我再检查一下。 IBOUTlet 设置为强是不好的 是的。我正在寻找替代提取方法【参考方案7】:

我尝试了我的代码,它工作正常

IBOutlet UITextView *tv;

//---------Enable button action.

-(IBAction)enable:(id)sender

    tv.scrollEnabled=YES;


//---------Disable button action.

-(IBAction)disable:(id)sender

    tv.scrollEnabled=NO;

在设备中再次尝试您的代码。

【讨论】:

你在模拟器/设备iOS8中检查了吗? 我在模拟器和设备上都检查过了 是的,当然。让我检查一下 将您的属性属性从弱更改为强。那么它会正常工作。我让它工作正常。我可以将解决方案显示为另一个答案吗?除了这个属性属性之外,我没有更改您项目中的任何内容【参考方案8】:

试试这个

func scrollViewDidScroll(_ scrollView: UIScrollView) 
    tableView.setContentOffset(CGPoint.zero, animated: false)

【讨论】:

以上是关于UITextView scrollEnabled = YES 在 iOS8 中设置 scrollEnabled = NO 后不起作用的主要内容,如果未能解决你的问题,请参考以下文章

滚动到 UITextView 文本的末尾

Objective-C UITextView的使用方法

iOS 开发-UITextView(第二种输入框)的使用

UITextView setText 不应该在 ios8 中跳到顶部

外部 UIScrollView 的 scrollViewDidScroll 内的 scrollEnabled 需要两次滑动

如何成为从一个 UITextView 到另一个 UITextView 的响应者?