ios7UITextView滚动不稳定

下面的代码将正常工作在iOS中<7.0。在iOS的7滚动将是不稳定的和不稳定的,而UITextView中正在更新。我不知道这是否是在iOS的7个bug,还是我做错了。 TestController.h
//TODO: Add UITextView in storyboard and tie to textView outlet

#define MAX_TEXT_VIEW_CHARACTERS 1000
@interface TestController : UIViewController {
 NSMutableString *_outputText;
 NSTimer *_outputTimer;
}

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

@end

TestController.m
@implementation TestController
@synthesize textView;

- (void)viewWillAppear:(BOOL)animated {
 [super viewWillAppear:animated];
 _outputText = [NSMutableString stringWithCapacity:MAX_TEXT_VIEW_CHARACTERS];
 _outputTimer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(outputLine:) userInfo:nil repeats:YES];
}

-(void)outputLine:(NSTimer *) theTimer {
 static int i = 0;
 //Run this 100 times
 if (i > 99) {
  [_outputTimer invalidate];
  return;
 }
 [self outputToScreen:[NSString stringWithFormat:@"Some string %d\r", ++i]];
}

-(void)outputToScreen:(NSString *)str {
 if (!str || !str.length) return; //Nothing to output

 NSInteger outputTextSize = _outputText.length;
 [_outputText appendString:str];
 if (outputTextSize > MAX_TEXT_VIEW_CHARACTERS)
  [_outputText deleteCharactersInRange:NSMakeRange(0, outputTextSize - MAX_TEXT_VIEW_CHARACTERS)];
 self.textView.text = _outputText;

 [self scrollOutputToBottom];
}

-(void)scrollOutputToBottom {
 CGPoint p = [textView contentOffset];
 [textView setContentOffset:p animated:NO];
 [textView scrollRangeToVisible:NSMakeRange([textView.text length], 0)];
}

@end

经过验证,这个方法可以解决超出frame后的输入中文不稳定,发生抖动问题。(lgh注)
1. 这是在iOS 7的bug。这里是一个解决方法,直到苹果修复它。解决方法基本上是通过从头开始创建一个NSTextStorage和NSLayoutManager实例化一个UITextView。苹果一定是忘在UITextView中我提出一个bug报告来初始化,我希望你也这样做。
 // ios7 bug fix
// check if the device is running iOS 7.0 or later
NSString *reqSysVer = @"7.0";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
BOOL osVersionSupported = ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending);

if (osVersionSupported) {
 NSTextStorage* textStorage = [[NSTextStorage alloc] init];
 NSLayoutManager* layoutManager = [NSLayoutManager new];
 [textStorage addLayoutManager:layoutManager];
 NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:self.view.bounds.size];
 [layoutManager addTextContainer:textContainer];
 yourTextView = [[UITextView alloc] initWithFrame:someFrameForYourTextView
          textContainer:textContainer];
 // if using ARC, remove these 3 lines
 [textContainer release];
 [layoutManager release];
 [textStorage release];
}
else
 yourTextView = [[UITextView alloc] initWithFrame:someFrameForYourTextView];



2. 有在iOS的7两个问题,可以解释你的问题: 该contentOffset并不总是最新的iOS中7。 scrollRangeToVisible:不会滚动到文本视图的末尾空行。 该溶液可以是:
-(void)scrollOutputToBottom {
 CGRect caretRect = [textView caretRectForPosition:textView.endOfDocument];
 [textView scrollRectToVisible:caretRect animated:NO];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值