【问题标题】:Can I animate a view to fade in from hidden?我可以为视图设置动画以从隐藏中淡入吗?
【发布时间】:2017-08-02 23:00:37
【问题描述】:

我试图在初始视图加载后 5 秒后让视图 scrim 淡入视图控制器中的所有内容。这就是我现在所拥有的。

- (void)viewDidLoad {


[super viewDidLoad];
// Do any additional setup after loading the view.

[self setupAlarmPoll];
[self setupTimeLabel];
self.shouldRefresh = YES;
[self refreshSpotifyToken];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(receiveNotification:)
                                             name:@"backHome"
                                           object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(receiveNotification:)
                                             name:@"applicationDidEnterBackground"
                                           object:nil];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{

    [UIView animateWithDuration:2.00 animations:^{

       self.scrim.hidden = NO;
    }];



});

但是,我没有逐渐淡入。视图刚刚出现。如何在 Objective-c 中完成这个动画?

【问题讨论】:

  • 试试self.scrim.alpha = 1.0;
  • 在 didLoad 中将 scrim.alpha = 0 设置为 0,在 Animation 部分设置为 1.0

标签: ios objective-c animation


【解决方案1】:

视图的hidden 属性不可设置动画。但是,alpha 属性动画的。您需要:

  1. 将 alpha 设置为零
  2. 将隐藏设置为假。
  3. 将 alpha 设置为 1.0

通过这样做,您可以使视图不再隐藏,而是完全透明。您将 alpha 属性从 0.0 设置为 1.0,使视图根据需要淡入。

代码如下所示:

self.scrim.alpha = 0;
self.scrim.hidden = NO;
[UIView animateWithDuration:2.00 
  delay: 5.0
  options: 0
  animations:^{
   self.scrim.alpha = 1.0;
  }
  completion: nil
];

(请注意,长格式 animateWithDuration 采用延迟参数,因此您不必将其包装在对 dispatch_after 的调用中。)

另外,您为什么要在 Objective-C 中进行新开发?

【讨论】:

  • 感谢您的澄清,邓肯。我之前尝试过为 alpha 属性设置动画,但没有先将 alpha 设置为 0。我使用 Objective-C 的原因是该项目是由另一个开发人员编写的,而我只是在修改他的代码。我希望我可以用 Swift 代替它。
【解决方案2】:

是的,但您要查找的不是isHidden,而是视图的alpha 属性。你看,isHidden 会直接声明是否 100% 无法看到根本。因此,您不能为UIViewisHidden 属性设置动画。但这就是 alpha 属性的用武之地,因为它旨在完全按照您尝试使用 isHidden 的方式使用。 alpha 属性决定了UIView 在屏幕上的淡化。因此,如果alpha 位于0,则它是隐藏的。因此,如果您将视图的 alpha 设置为 0 然后使用以下代码,您可以淡入视图:

// Swift
UIView.animate(withDuration: 0.25) { 
    view.alpha = 1
}

// Objective-C
[UIView animateWithDuration:0.25 ^{
    self.view.alpha = 1.0;
}];

【讨论】:

  • 谢谢,这完全有道理!
【解决方案3】:

像其他人提到的那样对alpha 进行动画处理,或者将transitionWithViewUIViewAnimationOptionTransitionCrossDissolve 一起使用:

- (void)viewDidLoad {
    [super viewDidLoad];

    self.scrim.hidden = true;
}

- (void)viewDidAppear:(BOOL)animated {
    [UIView transitionWithView:self.scrim duration:2 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        self.scrim.hidden = false;
    } completion:nil];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2019-08-30
    相关资源
    最近更新 更多