当用户滚动相邻的 UIScrollView 时,我的 UIView 子类不调用 drawRect
My UIView subclass doesn't call drawRect while the user is scrolling an adjacent UIScrollView
我有一个 UIView
的子类,叫做 UIRefreshView
。它在生活中的唯一目的是,当您向它传递 NSDate*
时,它会显示一个矩形,该矩形会逐渐变小,直到 NSDate*
接近其宽度为零的点。
它在正常情况下运行良好。但是,当用户在相邻的 UITableView
上按住手指时,矩形在 UITableView
滚动时停止收缩。然后,它 'jumps' 到它应该的宽度。
我做错了什么?
我的代码(略有删减)如下。
@implementation UIRefreshView
- (void) commonInit {
self.backgroundColor = [UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:1.0];
self.color = [UIColor darkGrayColor]; // default
}
- (void) beginAnimatingUntilTime:(NSDate *)targetTime {
// Store total number of seconds until the rectangle should be gone
self.refreshInterval = ([targetTime timeIntervalSinceDate:[NSDate date]]);
self.refreshTimer = [NSTimer scheduledTimerWithTimeInterval:0.0333333 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];
}
- (void) timerTick:(id)sender {
[self setNeedsDisplay];
}
- (void) drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect foreRectangle = CGRectMake(0, 0, (self.bounds.size.width * [self percentageTimeRemaining]), self.bounds.size.height);
// Draw BG rectangle
CGContextSetFillColorWithColor(context, self.backgroundColor.CGColor);
CGContextAddRect(context, CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height));
CGContextFillPath(context);
//Draw a rectangle
CGContextSetFillColorWithColor(context, self.color.CGColor);
CGContextAddRect(context, foreRectangle);
CGContextFillPath(context);
}
- (double) percentageTimeRemaining {
NSTimeInterval timeUntilRefresh = ([self.refreshTime timeIntervalSinceDate:[NSDate date]]);
return (timeUntilRefresh / self.refreshInterval);
}
What am I doing wrong?
您做错的是您使用了动画计时器。你永远不应该那样做。你的第一选择应该是:使用真实的动画!这样,无论发生什么情况,动画服务器都会为您处理这件事。
我有一个 UIView
的子类,叫做 UIRefreshView
。它在生活中的唯一目的是,当您向它传递 NSDate*
时,它会显示一个矩形,该矩形会逐渐变小,直到 NSDate*
接近其宽度为零的点。
它在正常情况下运行良好。但是,当用户在相邻的 UITableView
上按住手指时,矩形在 UITableView
滚动时停止收缩。然后,它 'jumps' 到它应该的宽度。
我做错了什么?
我的代码(略有删减)如下。
@implementation UIRefreshView
- (void) commonInit {
self.backgroundColor = [UIColor colorWithRed:0.8 green:0.8 blue:0.8 alpha:1.0];
self.color = [UIColor darkGrayColor]; // default
}
- (void) beginAnimatingUntilTime:(NSDate *)targetTime {
// Store total number of seconds until the rectangle should be gone
self.refreshInterval = ([targetTime timeIntervalSinceDate:[NSDate date]]);
self.refreshTimer = [NSTimer scheduledTimerWithTimeInterval:0.0333333 target:self selector:@selector(timerTick:) userInfo:nil repeats:YES];
}
- (void) timerTick:(id)sender {
[self setNeedsDisplay];
}
- (void) drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGRect foreRectangle = CGRectMake(0, 0, (self.bounds.size.width * [self percentageTimeRemaining]), self.bounds.size.height);
// Draw BG rectangle
CGContextSetFillColorWithColor(context, self.backgroundColor.CGColor);
CGContextAddRect(context, CGRectMake(0, 0, self.bounds.size.width, self.bounds.size.height));
CGContextFillPath(context);
//Draw a rectangle
CGContextSetFillColorWithColor(context, self.color.CGColor);
CGContextAddRect(context, foreRectangle);
CGContextFillPath(context);
}
- (double) percentageTimeRemaining {
NSTimeInterval timeUntilRefresh = ([self.refreshTime timeIntervalSinceDate:[NSDate date]]);
return (timeUntilRefresh / self.refreshInterval);
}
What am I doing wrong?
您做错的是您使用了动画计时器。你永远不应该那样做。你的第一选择应该是:使用真实的动画!这样,无论发生什么情况,动画服务器都会为您处理这件事。