我正在给iOS上的一张图片上色。我正在使用滑块选择颜色。
当我将滑块上的"Update Events“设置为continuous时,调用的函数会被大量调用(滑块从0到1535),因此用户界面的响应不是很快。
有没有办法让下面的代码更有效率?我意识到我每次调用这个函数都是在开始一个新的绘图上下文--我可以“保存”这个上下文并重用它吗?
提前谢谢。
- (IBAction)bodyColourChanged:(UISlider *)sender {
// get the UIColor from self.colourArray
UIColor *color = [self.colourArray objectAtIndex:sender.value];
UIImage *myImage = [UIImage imageNamed:@"body.png"];
// Begin a new image context to draw the coloured image onto
UIGraphicsBeginImageContext(self.bodyView.image.size);
// Get a reference to the context we created
CGContextRef context = UIGraphicsGetCurrentContext();
// Set the fill colour
//[[UIColor colorWithRed:color.CGColor green:green blue:blue alpha:1.0] setFill];
[color setFill];
// translate/flip the graphics context (for transforming from CG* coords to UI* coords
CGContextTranslateCTM(context, 0, self.bodyView.image.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
// set the blend mode and the original image
CGContextSetBlendMode(context, kCGBlendModeOverlay);
CGRect rect = CGRectMake(0, 0, self.bodyView.image.size.width, self.bodyView.image.size.height);
CGContextDrawImage(context, rect, myImage.CGImage);
// Set a mask that matches the shape of the image, then draw (colour burn) a coloured rectangle
CGContextClipToMask(context, rect, self.bodyView.image.CGImage);
CGContextAddRect(context, rect);
CGContextDrawPath(context, kCGPathFill);
// Generate a new UIImage from the graphics context we drew onto
UIImage *colouredImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.bodyView.image = colouredImage;
}编辑:我上色的图片很大。它是1541x2000像素,因为我希望能够在不损失质量的情况下放大。也许这就是问题所在。我会继续修修补补,看看我能找到什么。
发布于 2013-04-03 23:25:33
我不确定你的着色方法,但我已经解决了滑块的类似性能问题,只在很小的延迟后调用性能密集型方法(即用户暂停了滑动)。
创建一些类变量/属性来保存与时间相关的对象:
@property (nonatomic, strong) NSDate *sliderValueChangedDate;
@property (nonatomic, strong) NSTimer *sliderValueChangedTimer;在连接到UISlider事件的方法中:
- (IBAction)sliderValueChanged:(id)sender {
// Save the time the slider was changed.
self.sliderValueChangedDate = [NSDate date];
// Start a timer if it's not already running.
if (!self.sliderValueChangedTimer) {
self.sliderValueChangedTimer = [NSTimer scheduledTimerWithTimeInterval:0.3 target:self selector:@selector(checkIfImageShouldBeColoured:) userInfo:nil repeats:YES];
}
}然后,在您的checkIfImageShouldBeColoured:方法中,您可以查看该值在此期间是否发生了更改:
- (void)checkIfImageShouldBeColoured:(NSTimer *)timer {
// Get how long has been elapsed since the slider was last changed.
NSTimeInterval elapsed = -[self.sliderValueChangedDate timeIntervalSinceNow];
// If this is over our threshold, then perform the intensive method.
if (elapsed > 0.3) {
[self.sliderValueChangedTimer invalidate];
self.sliderValueChangedTimer = nil;
[self changeBodyColour];
}
}https://stackoverflow.com/questions/15789603
复制相似问题