我的代码可以:
UIImageView *view ;
. . .
view.frame = rect ;
view.image = image ;
目标是使图像显示在特定位置。
我遇到的问题是首先显示图像分配。然后,图像出现在UIImageView捕捉到最终位置的位置。
如何确保视图位于所需位置之前(分配图像,使其可见)?
我忘了添加,图片视图在UIScrollView中。我也在设置contentOffset属性。这可能是显示问题。我需要在显示图像之前完成两个操作。
让我详细说明,因为我尝试的是第一个例子。我有两个图像视图,我试图用第二个替换第一个。
[iview1 removeFromSuperview] ;
iview1.hidden = NO ;
iview1.image = 0 ;
[UIView animateWithDuration:5 animations:
^{
scrollview.contentOffset = offset ;
iview2.frame = rect ;
} completion:^(BOOL finished) {
iview2.image = image ;
[scrollview addSubview:iview2] ;
iview2.alpha = 1.0 ;
}];
所有在主线程中执行。
令人惊讶的是,这具有以下效果:
如果我将延迟设置为0,则会发生闪烁。
我很困惑,因为我尽一切可能使image2不可见(删除了它的图像,使其隐藏,从其超级视图中移除)但它坚持在scrollOffset完成之前保持可见。
我知道排队的问题,但是,我的上帝,当你做了那么多隐藏图像时,为什么它不会消失?????
答案 0 :(得分:0)
如果imageView无法使用简单的removeFromSuperview
,请更改属性addSubview
,然后我会建议让它"消失",等待它设置然后让它再次出现。像这样:
UIImageView* view;
...
view.alpha = 0.0f;
UIView animateWithDuration:0.2 animations:^{
view.frame = rect;
view.image = image;
}completion:^(BOOL finished){
view.alpha = 1.0f;
}
编辑:看到您的进一步修改,我建议进行以下更改:
[iview1 removeFromSuperview] ;
iview1.hidden = YES;
iview1.image = nil ;
[scrollview addSubview:iview2];
iview2.alpha = 0;
iview2.image = image ; //you could make this assignment in the completion block as well
[UIView animateWithDuration:5 animations:
^{
scrollview.contentOffset = offset ;
iview2.frame = rect ;
} completion:^(BOOL finished) {
iview2.alpha = 1.0 ;
}];
希望这能解决你的问题。
答案 1 :(得分:0)
这看起来像动画的问题。我得到的最佳答案是使用时序延迟。
[iview1 removeFromSuperview];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(NSEC_PER_SEC * 0.001)), dispatch_get_main_queue(), ^{
[UIView animateWithDuration:5 animations:^{
scrollview.contentOffset = offset;
} completion:^(BOOL finished) {
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(NSEC_PER_SEC * 0.001)), dispatch_get_main_queue(), ^{
iview2.frame = rect;
iview2.image = image;
[scrollview addSubview:iview2];
});
}];
});
我知道这看起来很疯狂,但我的想法是将其他动作移动到其他运行循环中,这样它们就不受动画的影响。