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.1 和 iOS 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 setText 不应该在 ios8 中跳到顶部
外部 UIScrollView 的 scrollViewDidScroll 内的 scrollEnabled 需要两次滑动