Создание эффекта затухания с NSView - PullRequest
2 голосов
/ 23 апреля 2011

У меня есть подпредставление, которое я хочу показать, чтобы создать эффект исчезновения. Для этого я пытаюсь:

  1. Показать
  2. Fade it

Для этой цели я установил метод 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 ]

1 голос
/ 26 апреля 2011

У меня была такая же проблема давным-давно (но я так и не решил ее), но я думаю, что это может иметь какое-то отношение к тому, что вы просите, чтобы ваше мнение показывало и , растворенные втот же цикл обработки событий.

Я полагаю, вы должны позволить циклу обработки событий выполнить итерацию (чтобы ваше представление действительно отображалось), прежде чем просить о его растворении.Я думаю, вы могли бы сделать это, установив (короткий) таймер, который будет срабатывать через пару миллисекунд после отображения представления (setHidden:NO).Я также думаю, что есть более простые способы решения проблемы (и я был бы рад их услышать).

Более того, вы также можете попробовать animator setAlphaValue:0.0, чтобы получить плавный переход.

Я не совсем уверен, что у меня правильный ответ, это всего лишь предложение ...

0 голосов
/ 21 марта 2015

Этот метод отлично работает, чтобы изображение получалось размытым и плавно фокусировалось.

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
    }
}
0 голосов
/ 24 апреля 2011

hidden - это свойство BOOL, вы не можете анимировать BOOL, потому что есть только два дискретных значения: NO и YES. Вместо этого используйте непрозрачность, вы можете анимировать непрозрачность от 1,0 (полностью видимой) до 0,0 (невидимой), чтобы исчезнуть. Для того чтобы это работало, для параметра hidden должно быть установлено значение NO, иначе оно будет скрыто все время.

...