我有一个子视图,我想要显示它以产生溶解淡化效果。为此,我试图:
为此,我在我的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在一组图像之间循环,并使“推子”显示前一个图像并淡出。问题是它只出现一次。
答案 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
}
}