使用NSView实现淡入淡出效果

时间:2011-04-23 15:15:09

标签: objective-c cocoa core-animation nsview

我有一个子视图,我想要显示它以产生溶解淡化效果。为此,我试图:

  1. 显示
  2. 淡出它
  3. 为此,我在我的superview上设置了一个“showFade”方法(Fader是之前定义的子视图。已经定义了someImage)。

    - (void)showFade {
    
      [Fader setHidden:NO];
      [Fader setImage: someImage];
      [[Fader animator] setHidden:YES];
    
    }
    

    问题是:它第一次起作用,子视图消失,但它再也不会出现。我做错了什么?

    编辑:根据要求,这是一个更完整的代码示例

    - (void)awakeFromNib {
    
      Fader = [[NSImageView alloc] initWithFrame: [self bounds]];
      Images[0] = @"Tower";
      Images[1] = @"Desert";
      Images[2] = @"Fall";
      image = 0;
    
      [NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(showFader:) userInfo:nil repeats:YES];
      [self addSubview: Fader];
      [self nextImage];
      [super awakeFromNib];
    
    }
    
    - (void)showFader: (NSTimer*)timer {
    
      [Fader setImage: [self image]];
      [Fader setHidden:NO];
      [[Fader animator] setHidden:YES];
    
      [self nextImage];
    
    }
    
    - (void)nextImage {
      if (image == 2) {
        image = 0;
      }
      else {
        image++;
      }
    
      [self setImage: [NSImage imageNamed: Images[image]]];
    
    }
    

    所以,基本上,我有一个重复的计时器,使父NSImageView在一组图像之间循环,并使“推子”显示前一个图像并淡出。问题是它只出现一次。

3 个答案:

答案 0 :(得分:1)

很久以前我遇到了同样的问题(但我从来没有解决过),但我认为这可能与你要求你的观点显示的事实有关相同的事件循环。

我想你应该让事件循环进行迭代(以便实际显示你的视图),然后再要求解散视图。 我想你可以通过设置一个(短)计时器来实现它,这个计时器在显示视图后会被激活几毫秒(setHidden:NO)。 我也猜测有更简单的方法可以解决问题(我很乐意听到它们)。

此外,您还可以尝试animator setAlphaValue:0.0进行平稳过渡。

我不是肯定不确定我有正确答案,这只是一个建议......

答案 1 :(得分:0)

hidden是一个BOOL属性,你不能动画BOOL因为只有两个离散值:NO和YES。使用不透明度,您可以将不透明度从1.0(完全可见)设置为0.0(不可见)以淡出。隐藏必须设置为NO才能使其工作,否则它将一直隐藏。

答案 2 :(得分:-1)

这种方法对我来说非常有效,可以让图像开始变得模糊,平滑地成为焦点。

let parentView = UIView() 
let imageView = UIImageView(image: UIImage(named: "ImageToFocus"))
parentView.addSubview(imageView)
let blurEffect = UIBlurEffect(style: .Light)
let blurView = UIVisualEffectView(effect: blurEffect)
blurView.frame = imageView.frame
blurView.alpha = 1.0
self.blurTimer = NSTimer.scheduledTimerWithTimeInterval(0.05, target: self, selector: Selector("animateBlur:"), userInfo: blurView, repeats: true)

func animateBlur(timer:NSTimer)
{
    let blurView = timer.userInfo as UIVisualEffectView

    if blurView.alpha > 0.0 {
        blurView.alpha -= 0.05
    } else {
        blurTimer = nil
    }
}