Как addSubView (UIImage) с анимацией? [Дубликат]

Это делается путем делегирования событий. Событие будет привязываться к элементу-оболочке, но будет делегировано элементу селекторного класса. Вот как это работает.

$('.wrapper-class').on("click", '.selector-class', function() {
    // Your code here
});

Примечание:

Элемент-оболочка-оболочка может быть любым ex. документа, тела или вашей обертки. Упаковщик должен уже существовать.

115
задан IPS Brar 7 April 2017 в 10:29
поделиться

13 ответов

В iOS 4 и более поздних версиях есть способ сделать это, используя метод перехода UIView без необходимости импортировать QuartzCore. Вы можете просто сказать:

[UIView transitionWithView:button
                  duration:0.4
                   options:UIViewAnimationOptionTransitionCrossDissolve
                animations:^{
                     button.hidden = YES;
                }
                completion:NULL];

Предыдущее решение

Решение Michail будет работать, но на самом деле это не лучший подход.

Проблема с альфа-замиранием что иногда разные перекрывающиеся слои выглядят странно, когда они исчезают. Существуют и другие альтернативы, использующие Core Animation. Сначала включите среду QuartzCore в ваше приложение и добавьте #import <QuartzCore/QuartzCore.h> в свой заголовок. Теперь вы можете выполнить одно из следующих действий:

1) установить button.layer.shouldRasterize = YES;, а затем использовать код альфа-анимации, который был предоставлен Михаилом в его ответе. Это предотвратит странное смешение слоев, но имеет небольшое ограничение производительности и может заставить кнопку выглядеть размытой, если она не выровнена точно на границе пикселя.

Альтернативно:

2 ) Используйте следующий код, чтобы анимировать затухание:

CATransition *animation = [CATransition animation];
animation.type = kCATransitionFade;
animation.duration = 0.4;
[button.layer addAnimation:animation forKey:nil];

button.hidden = YES;

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

217
ответ дан robmathers 18 August 2018 в 15:19
поделиться
  • 1
    @robmathers, я просто проверяю ваш код, над двумя кодами просто работают, когда button.hidden = NO, для угасания ситуации; не имеют эффекта анимации для постепенного исчезновения, когда button.hidden = YES; – Jason 9 July 2017 в 05:45

Swift 3

func appearView() {
     self.myView.alpha = 0
     self.myView.isHidden = false

     UIView.animate(withDuration: 0.9, animations: {
         self.myView.alpha = 1
     }, completion: {
         finished in
         self.myView.isHidden = false
     })
}
6
ответ дан FrenchFalcon 18 August 2018 в 15:19
поделиться

Вы можете попробовать это.

 func showView(objView:UIView){

    objView.alpha = 0.0
    UIView.animate(withDuration: 0.5, animations: {
        objView.alpha = 0.0
    }, completion: { (completeFadein: Bool) -> Void in
        objView.alpha = 1.0
        let transition = CATransition()
        transition.duration = 0.5
        transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        transition.type = kCATransitionFade
        objView.layer.add(transition, forKey: nil)
    })
}

func HideView(objView:UIView){

    UIView.animate(withDuration: 0.5, animations: {
        objView.alpha = 1.0
    }, completion: { (completeFadein: Bool) -> Void in
        objView.alpha = 0.0
        let transition = CATransition()
        transition.duration = 0.5
        transition.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
        transition.type = kCATransitionFade
        objView.layer.add(transition, forKey: nil)
    })
}

И передайте свое имя вида

        showView(objView: self.viewSaveCard)
        HideView(objView: self.viewSaveCard)
0
ответ дан kalpesh 18 August 2018 в 15:19
поделиться

Анимированные свойства UIView:

- frame
- bounds
- center
- transform
- alpha
- backgroundColor
- contentStretch

Опишите в: Анимация

isHidden не является одной из их, так как я вижу это наилучшим образом:

Swift 4:

func setView(view: UIView, hidden: Bool) {
    UIView.transition(with: view, duration: 0.5, options: .transitionCrossDissolve, animations: {
        view.isHidden = hidden
    })
}

Цель C:

- (void)setView:(UIView*)view hidden:(BOOL)hidden {
    [UIView transitionWithView:view duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^(void){
        [view setHidden:hidden];
    } completion:nil];
}
109
ответ дан Mahendra GP 18 August 2018 в 15:19
поделиться
  • 1
    На самом деле это простой и лучший ответ – Irshad Mohamed 12 August 2015 в 13:21
  • 2
    Это слишком хорошо. – Shahzaib Maqbool 11 April 2016 в 08:21
  • 3
    Хотя это анимируется правильно, UISearchBar, который я пытаюсь отобразить, отображается не в том месте, пока анимация не завершится, а затем мгновенно перейдет в правильное положение. Есть идеи? Я использую раскадровки с помощью интерфейса Builder и Constraints. – Greg Hilston 13 June 2017 в 21:52
  • 4
    Этот код не работает ... он напрямую изменяет состояние без анимации – mihir mehta 27 June 2017 в 06:49
  • 5
    @evya Работает только для скрытия, когда скрыто = НЕТ, Не работает для постепенного исчезновения, скрыто = ДА – Jason 9 July 2017 в 05:51

Я использую это небольшое расширение Swift 3:

extension UIView {

  func fadeIn(duration: TimeInterval = 0.5,
              delay: TimeInterval = 0.0,
              completion: @escaping ((Bool) -> Void) = {(finished: Bool) -> Void in }) {
    UIView.animate(withDuration: duration,
                   delay: delay,
                   options: UIViewAnimationOptions.curveEaseIn,
                   animations: {
      self.alpha = 1.0
    }, completion: completion)
  }

  func fadeOut(duration: TimeInterval = 0.5,
               delay: TimeInterval = 0.0,
               completion: @escaping (Bool) -> Void = {(finished: Bool) -> Void in }) {
    UIView.animate(withDuration: duration,
                   delay: delay,
                   options: UIViewAnimationOptions.curveEaseIn,
                   animations: {
      self.alpha = 0.0
    }, completion: completion)
  }
}
5
ответ дан Mark Mckelvie 18 August 2018 в 15:19
поделиться

Чтобы исчезнуть:

[UIView animateWithDuration:0.3 animations:^{
    button.alpha = 0;
} completion: ^(BOOL finished) {//creates a variable (BOOL) called "finished" that is set to *YES* when animation IS completed.
    button.hidden = finished;//if animation is finished ("finished" == *YES*), then hidden = "finished" ... (aka hidden = *YES*)
}];

// swift:
UIView.animateWithDuration(0.3, animations: {
    button.alpha = 0
}) { (finished) in
    button.hidden = finished
}

Чтобы затухать:

button.alpha = 0;
button.hidden = NO;
[UIView animateWithDuration:0.3 animations:^{
    button.alpha = 1;
}];

// swift:
button.alpha = 0
button.hidden = false
UIView.animateWithDuration(0.3) {
    button.alpha = 1
}
106
ответ дан Mikhail Grebionkin 18 August 2018 в 15:19
поделиться
  • 1
    использование fade in / out в сочетании со скрытым состоянием решило мою проблему – ACLima 1 June 2016 в 15:58
  • 2
    По какой-то причине анимация в hidden = YES работала отлично для меня, но анимация в hidden = NO ничего не делала, поэтому эта комбинация анимации альфы и настройки скрытого свойства была полезна. – arlomedia 10 February 2017 в 02:30
  • 3
    Я просто пишу демо, но только скрытый = НЕТ, исчезает в работах, странно – Jason 9 July 2017 в 05:48

Swift 4 Transition

    UIView.transition(with: view, duration: 3, options: .transitionCurlDown,
                      animations: {
                        // Animations
                        view.isHidden = hidden
    },
                      completion: { finished in
                        // Compeleted
    })

Если вы используете подход для более старых версий, вы получите сообщение об ошибке:

Cannot convert value of type '(_) -> ()' to expected argument type '(() -> Void)?'

Полезно ссылка .

0
ответ дан nanospeck 18 August 2018 в 15:19
поделиться
  • 1
    это работает с автозапуском? аналогичный код не анимируется. значение isHidden отображается мгновенно (т. е. мгновенно скрывать / показывать вид). – Crashalot 1 November 2017 в 10:04

Мое решение для Swift 3. Итак, я создал функцию, которая скрывает / скрывает представление в правильном порядке (при скрытии - устанавливает альфа-значение в 0, а затем isHidden для истины; unhiding - сначала открывает представление, а затем устанавливает его альфа к 1):

func hide(_ hide: Bool) {
    let animations = hide ? { self.alpha = 0 } :
                            { self.isHidden = false }
    let completion: (Bool) -> Void = hide ? { _ in self.isHidden = true } :
                                            { _ in UIView.animate(withDuration: duration, animations: { self.alpha = 1 }) }
    UIView.animate(withDuration: duration, animations: animations, completion: completion)
}
0
ответ дан Nazariy Vlizlo 18 August 2018 в 15:19
поделиться
  • 1
    Почему в блоке completion есть еще одна анимация, когда hide ложна? – Giorgio 19 June 2018 в 10:58

Вы можете сделать это ОЧЕНЬ легко используя библиотеку Animatics :

//To hide button:
AlphaAnimator(0) ~> button

//to show button
AlphaAnimator(1) ~> button
1
ответ дан Nikita Arkhipov 18 August 2018 в 15:19
поделиться

Swift 4

extension UIView {

func fadeIn(duration: TimeInterval = 0.5, delay: TimeInterval = 0.0, completion: @escaping ((Bool) -> Void) = {(finished: Bool) -> Void in }) {
    self.alpha = 0.0

    UIView.animate(withDuration: duration, delay: delay, options: UIViewAnimationOptions.curveEaseIn, animations: {
        self.isHidden = false
        self.alpha = 1.0
    }, completion: completion)
}

func fadeOut(duration: TimeInterval = 0.5, delay: TimeInterval = 0.0, completion: @escaping (Bool) -> Void = {(finished: Bool) -> Void in }) {
    self.alpha = 1.0

    UIView.animate(withDuration: duration, delay: delay, options: UIViewAnimationOptions.curveEaseIn, animations: {
        self.alpha = 0.0
    }) { (completed) in
        self.isHidden = true
        completion(true)
    }
}
}

И чтобы использовать его, просто вызовите следующие функции:

yourView.fadeOut() // this will hide your view with animation
yourView.fadeIn() /// this will show your view with animation
-1
ответ дан Umair Afzal 18 August 2018 в 15:19
поделиться
  • 1
    Вы только что скопировали ответ @ MarkMckelvie – Ashley Mills 19 July 2018 в 11:09
  • 2
    Есть разница, он не скрывал этого взгляда. И мне тоже нужно было скрыть представление. Так и сделал, и поделился им. – Umair Afzal 19 July 2018 в 11:12
  • 3
    Почему бы просто не прокомментировать другой ответ вместо того, чтобы копировать его и передавать как свой собственный? – Ashley Mills 19 July 2018 в 11:13
  • 4
    Я могу удалить ответ, если хочешь. – Umair Afzal 19 July 2018 в 11:14

Для этой цели я создал категорию для UIView и внедрил совершенно другую концепцию: visibility. Основное отличие моего решения заключается в том, что вы можете вызвать [view setVisible:NO animated:YES] и сразу после этого синхронно проверить [view visible] и получить правильный результат. Это довольно просто, но очень полезно.

Кроме того, разрешено избегать использования «отрицательной логической логики» (см. Code Complete, стр. 269, Использовать положительные имена переменных boolean для более информация).

Swift

UIView+Visibility.swift

import UIKit


private let UIViewVisibilityShowAnimationKey = "UIViewVisibilityShowAnimationKey"
private let UIViewVisibilityHideAnimationKey = "UIViewVisibilityHideAnimationKey"


private class UIViewAnimationDelegate: NSObject {
    weak var view: UIView?

    dynamic override func animationDidStop(animation: CAAnimation, finished: Bool) {
        guard let view = self.view where finished else {
            return
        }

        view.hidden = !view.visible
        view.removeVisibilityAnimations()
    }
}


extension UIView {

    private func removeVisibilityAnimations() {
        self.layer.removeAnimationForKey(UIViewVisibilityShowAnimationKey)
        self.layer.removeAnimationForKey(UIViewVisibilityHideAnimationKey)
    }

    var visible: Bool {
        get {
            return !self.hidden && self.layer.animationForKey(UIViewVisibilityHideAnimationKey) == nil
        }

        set {
            let visible = newValue

            guard self.visible != visible else {
                return
            }

            let animated = UIView.areAnimationsEnabled()

            self.removeVisibilityAnimations()

            guard animated else {
                self.hidden = !visible
                return
            }

            self.hidden = false

            let delegate = UIViewAnimationDelegate()
            delegate.view = self

            let animation = CABasicAnimation(keyPath: "opacity")
            animation.fromValue = visible ? 0.0 : 1.0
            animation.toValue = visible ? 1.0 : 0.0
            animation.fillMode = kCAFillModeForwards
            animation.removedOnCompletion = false
            animation.delegate = delegate

            self.layer.addAnimation(animation, forKey: visible ? UIViewVisibilityShowAnimationKey : UIViewVisibilityHideAnimationKey)
        }
    }

    func setVisible(visible: Bool, animated: Bool) {
        let wereAnimationsEnabled = UIView.areAnimationsEnabled()

        if wereAnimationsEnabled != animated {
            UIView.setAnimationsEnabled(animated)
            defer { UIView.setAnimationsEnabled(!animated) }
        }

        self.visible = visible
    }

}

Цель-C

UIView+Visibility.h

#import <UIKit/UIKit.h>

@interface UIView (Visibility)

- (BOOL)visible;
- (void)setVisible:(BOOL)visible;
- (void)setVisible:(BOOL)visible animated:(BOOL)animated;

@end

UIView+Visibility.m

#import "UIView+Visibility.h"

NSString *const UIViewVisibilityAnimationKeyShow = @"UIViewVisibilityAnimationKeyShow";
NSString *const UIViewVisibilityAnimationKeyHide = @"UIViewVisibilityAnimationKeyHide";

@implementation UIView (Visibility)

- (BOOL)visible
{
    if (self.hidden || [self.layer animationForKey:UIViewVisibilityAnimationKeyHide]) {
        return NO;
    }

    return YES;
}

- (void)setVisible:(BOOL)visible
{
    [self setVisible:visible animated:NO];
}

- (void)setVisible:(BOOL)visible animated:(BOOL)animated
{
    if (self.visible == visible) {
        return;
    }

    [self.layer removeAnimationForKey:UIViewVisibilityAnimationKeyShow];
    [self.layer removeAnimationForKey:UIViewVisibilityAnimationKeyHide];

    if (!animated) {
        self.alpha = 1.f;
        self.hidden = !visible;
        return;
    }

    self.hidden = NO;

    CGFloat fromAlpha = visible ? 0.f : 1.f;
    CGFloat toAlpha = visible ? 1.f : 0.f;
    NSString *animationKey = visible ? UIViewVisibilityAnimationKeyShow : UIViewVisibilityAnimationKeyHide;

    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
    animation.duration = 0.25;
    animation.fromValue = @(fromAlpha);
    animation.toValue = @(toAlpha);
    animation.delegate = self;
    animation.removedOnCompletion = NO;
    animation.fillMode = kCAFillModeForwards;
    [self.layer addAnimation:animation forKey:animationKey];
}

#pragma mark - CAAnimationDelegate

- (void)animationDidStop:(CAAnimation *)animation finished:(BOOL)finished
{
    if ([[self.layer animationForKey:UIViewVisibilityAnimationKeyHide] isEqual:animation]) {
        self.hidden = YES;
    }
}

@end
6
ответ дан Valentin Shergin 18 August 2018 в 15:19
поделиться
func flipViews(fromView: UIView, toView: UIView) {

    toView.frame.origin.y = 0

    self.view.isUserInteractionEnabled = false

    UIView.transition(from: fromView, to: toView, duration: 0.5, options: .transitionFlipFromLeft, completion: { finished in            

        fromView.frame.origin.y = -900

        self.view.isUserInteractionEnabled = true

    })


}
1
ответ дан Vimal Saifudin 18 August 2018 в 15:19
поделиться
0
ответ дан Prasanna 30 October 2018 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: