在显示之前确保视图处于适当位置

时间:2014-04-07 01:07:25

标签: ios uiview

我的代码可以:

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 ;
 }];

所有在主线程中执行。

令人惊讶的是,这具有以下效果:

  1. 将image1移动到image2的所需位置。
  2. image1图像慢慢滚动屏幕。
  3. 当它到达最后一点时,它会消失并出现image2。
  4. 如果我将延迟设置为0,则会发生闪烁。

    我很困惑,因为我尽一切可能使image2不可见(删除了它的图像,使其隐藏,从其超级视图中移除)但它坚持在scrollOffset完成之前保持可见。

    我知道排队的问题,但是,我的上帝,当你做了那么多隐藏图像时,为什么它不会消失?????

2 个答案:

答案 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];
        });
    }];
});

我知道这看起来很疯狂,但我的想法是将其他动作移动到其他运行循环中,这样它们就不受动画的影响。