嗨,Stackoverflow的家伙们!
我的代码中需要您的帮助。我写了一个小应用程序,实时模糊了相机。
为此,我使用了Brad Larson的<{3}}框架(感谢Brad Larson)!
现在我想通过动画从相机中删除模糊。此动画的持续时间应为 2 秒。所以我设置了我的代码,以便从我的相机中删除过滤器,如下所示:
-(IBAction)BtnPressed:(id)sender {
[UIView animateWithDuration: 2
animations:^{
[(GPUImageTiltShiftFilter *)filter setBlurSize:0.0];
}];
}
据我所知,代码应该可行。但是,我运行应用程序并按下按钮,但过滤器未在两个秒内删除。
它被删除少超过一秒,这意味着上面的代码不起作用。
我尝试用一些代码来改变动态的alpha
,如下所示:
-(IBAction)BtnPressed:(id)sender {
[UIView animateWithDuration: 2
animations:^{
fstBtn.alpha = 0.0;
}];
}
此代码非常良好,持续时间两次秒。我不能看到解决方案。我真的很感激你的帮助。
提前致谢,
诺亚
答案 0 :(得分:2)
[UIView animateWithDuration...]
的区别在于UIView
要求动画CoreAnimation
的属性,内部使用GPUImage
。
UIView
过滤器不是UIView
,因此您无法使用GPUImage
动画机制为其任何属性设置动画。
为了设置NSTimer
过滤器的“unblurring”动画,我建议您创建重复blurSize
并在计时器的每个“tick”上,降低过滤器属性(0
case)一点直到- (void)blurIn
{
if (_bluringTimer) {
NSLog(@"WARNING: already blurring");
return;
}
// Blur filter is not yet active
if ([[self.blurFilter targets] count] == 0) {
self.blurFilter.blurSize = 0.0f;
// Add blur filter to the output
[self.activeFilter removeTarget:self.gpuImageView];
[self.activeFilter addTarget:self.blurFilter];
[self.blurFilter addTarget:self.gpuImageView];
}
// Start timer
// Blur animation is faked using timer and in(/de)credementing the filter size
_bluringTimer = [NSTimer timerWithTimeInterval:0.1
target:self
selector:@selector(blurTimerStep:)
userInfo:@(YES)
repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_bluringTimer forMode:NSRunLoopCommonModes];
NSLog(@"Blur start");
}
- (void)blurOut
{
if (_bluringTimer) {
NSLog(@"WARNING: already blurring");
return;
}
_bluringTimer = [NSTimer timerWithTimeInterval:0.05
target:self
selector:@selector(blurTimerStep:)
userInfo:@(NO)
repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:_bluringTimer forMode:NSRunLoopCommonModes];
}
/**
One step of blurring timer. This method takes care of incrementing / decrementing blur size of blur filter
@param timer Timer calling this method
*/
- (void)blurTimerStep:(NSTimer *)timer
{
static NSInteger Step;
BOOL blurringIn = [[timer userInfo] boolValue];
// Blurring settings
static NSTimeInterval BlurringDuration = 0.4;
static CGFloat MaxBlur = 3.0f;
CGFloat bluringStepsCount = BlurringDuration / timer.timeInterval;
CGFloat blurSizeStep = MaxBlur/bluringStepsCount;
// Make step in blurring
self.blurFilter.blurSize += (blurringIn ? blurSizeStep : -blurSizeStep);
Step++;
if (Step > bluringStepsCount) {
[_bluringTimer invalidate];
_bluringTimer = nil;
Step = 0;
// If blurring out, when its done, remove the blur filter from the filters chain
if (!blurringIn) {
// Reset filters chain (remove blur)
[self.activeFilter removeTarget:self.blurFilter];
[self.blurFilter removeAllTargets];
[self.activeFilter addTarget:self.gpuImageView];
self.blurFilter = nil;
NSLog(@"Blur filter removed");
}
}
}
。一旦它为零,使计时器无效,从摄像机中删除滤波器,也可以从所有变量中取出,并将其解除分配。
我使用这种方法并且工作正常。
你可以看看我的动画方法。我正在使用这两种工作正常。它们已经足够评论了,但请不要指望我一步一步地解释代码,因为它需要花费很多时间
{{1}}