在 UIView 的 animateWithDuration 块方法中阻止 self 和 dot 访问器的作用域

Posted

技术标签:

【中文标题】在 UIView 的 animateWithDuration 块方法中阻止 self 和 dot 访问器的作用域【英文标题】:Block scoping of self and dot accessors inside animateWithDuration block method of UIView 【发布时间】:2012-12-07 16:33:36 【问题描述】:

通过 animateWithDuration 块内的点访问器访问 self 和 self 的属性是否安全?

我遇到了一些与扩展自帧相关的动画故障,尤其是当我调用 self.frame 时,如下所示:

[UIView animateWithDuration:timeInterval animations:^
    self.citiesTableView.frame = CGRectMake(0, 100, 320, 120);
    self.frame = CGRectMake(0, 0, 320, 220);
 completion:^(BOOL completed)
    if (completed) 
        self.citiesTableView.frame = CGRectMake(0, 100, 320, 120);
        self.frame = CGRectMake(0, 0, 320, 220);
        [self.citiesTableView reloadData];
    
];

【问题讨论】:

【参考方案1】:

由于视图不保留块,因此在块内强捕获self 是安全的。当块强烈捕获self(通过访问实例变量有意或错误地)并被视图保留时,就会出现问题,例如,当使用块作为条形按钮项的响应时。在这里,块被执行并被丢弃。

【讨论】:

以上是关于在 UIView 的 animateWithDuration 块方法中阻止 self 和 dot 访问器的作用域的主要内容,如果未能解决你的问题,请参考以下文章

如何暂停和恢复 UIView.animateWithDuration

AnimateWithDuration 禁用 UIView 上的 userInteraction

如何在 animateWithDuration 块期间利用 UIView 的变化值?

在 animateWithDuration:completion 的完成块中删除 UIView

UIView.animateWithDuration 在滚动 uitableviewcell 后停止

Xcode 6 Beta 5 中的 UIView.animateWithDuration 更改