NSTextView,附加文本和平滑滚动
Posted
技术标签:
【中文标题】NSTextView,附加文本和平滑滚动【英文标题】:NSTextView, appending text and smooth scrolling 【发布时间】:2012-02-25 08:46:23 【问题描述】:我正在尝试在我实现的聊天历史视图中实现平滑滚动,但是如果我附加的内容足够大,平滑滚动只会滚动几行。
我的第一个猜测是视图本身还没有重绘。事实并非如此,即使使用 -display 强制立即绘制它仍然会中断。
- (void)scrollAnimated:(BOOL)animated
if( animated )
NSClipView *clipView = [[_chatHistoryView enclosingScrollView] contentView];
[NSAnimationContext beginGrouping];
[[NSAnimationContext currentContext] setDuration:0.100f];
NSPoint constrainedPoint = [clipView constrainScrollPoint:NSMakePoint(0, CGFLOAT_MAX)];
[[clipView animator] setBoundsOrigin:constrainedPoint];
[NSAnimationContext endGrouping];
else
NSRange range;
range.location = [[_chatHistoryView textStorage] length];
range.length = 1;
[_chatHistoryView scrollRangeToVisible:range];
我做错了什么?
【问题讨论】:
我确信这不会解决您的问题,但在非动画代码中,您的范围将超出范围,因为它将以长度 +1 结束。 使用该代码有一段时间了,我可能需要查看文档为什么最后一个字符的 (location+1) (因为长度是 (location+1) 我猜)是被接受。 【参考方案1】:这可能对你有帮助……
- (void)maybeAutoscrollForThumb:(ThumbImageView *)thumb
autoscrollDistance = 0;
// only autoscroll if the thumb is overlapping the thumbScrollView
if (CGRectIntersectsRect([thumb frame], [thumbScrollView bounds]))
CGPoint touchLocation = [thumb convertPoint:[thumb touchLocation] toView:thumbScrollView];
float distanceFromLeftEdge = touchLocation.x - CGRectGetMinX([thumbScrollView bounds]);
float distanceFromRightEdge = CGRectGetMaxX([thumbScrollView bounds]) - touchLocation.x;
if (distanceFromLeftEdge < AUTOSCROLL_THRESHOLD)
autoscrollDistance = [self autoscrollDistanceForProximityToEdge:distanceFromLeftEdge] * -1; // if scrolling left, distance is negative
else if (distanceFromRightEdge < AUTOSCROLL_THRESHOLD)
autoscrollDistance = [self autoscrollDistanceForProximityToEdge:distanceFromRightEdge];
// if no autoscrolling, stop and clear timer
if (autoscrollDistance == 0)
[autoscrollTimer invalidate];
autoscrollTimer = nil;
// otherwise create and start timer (if we don't already have a timer going)
else if (autoscrollTimer == nil)
autoscrollTimer = [NSTimer scheduledTimerWithTimeInterval:(1.0 / 60.0)
target:self
selector:@selector(autoscrollTimerFired:)
userInfo:thumb
repeats:YES];
【讨论】:
以上是关于NSTextView,附加文本和平滑滚动的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionView 在重新加载数据时滚动不平滑