1

嘿,Stackoverflow 的伙计们!

我需要你在我的代码中的帮助。我写了一个实时模糊相机的小应用程序。

为此,我使用了Brad Larson 的GPUImage框架(感谢 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;
                     }];
}

此代码运行良好,持续时间为2秒。我不到解决方案。我真的很感激你的帮助

提前致谢,

诺亚

4

1 回答 1

2

不同之处[UIView animateWithDuration...]在于调用动画UIView的属性,内部使用CoreAnimation.

GPUImage过滤器不是UIViews,因此您不能使用UIView动画机制为其任何属性设置动画。

为了动画过滤器的“不模糊” GPUImage,我建议您创建重复NSTimer并在计时器的每个“滴答”上,blurSize稍微降低过滤器属性(在您的情况下)直到它是0. 一旦它为零,使计时器无效,从相机中删除过滤器,也许从所有变量中删除并让它释放。

我使用这种方法并且工作正常。


你可以看看我的动画方法。我正在使用这两个都很好。他们的评论已经足够了,但是请不要指望我会逐步解释代码,因为这会花费很多时间

- (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");
        }
    }
}
于 2013-10-03T12:43:23.313 回答