2011-01-14 65 views
4

作为动画的一部分,我有一种观点,我想深入观察视图层次结构。 (我之前将它移动到视图层次结构的顶部,以便执行出现在其他UI元素顶部的动画)。我使用此代码,它执行正确的操作。将视图移动到不闪烁的新超级视图

CGRect rect = self.profileImage.frame; 
UIView *sv = self.profileImage.superview; 
[self.scrollview addSubview:self.profileImage]; 
rect = [self.scrollview convertRect:rect fromView:sv]; 
self.profileImage.frame = rect; 

但是,当我这样做时,视图闪烁。任何想法如何避免闪烁?

回答

0

尝试

CGRect rect = self.profileImage.frame; 
UIView *sv = self.profileImage.superview; 
rect = [self.scrollview convertRect:rect fromView:sv]; 
self.profileImage.frame = rect; 
[self.scrollview addSubview:self.profileImage]; 

CGRect rect = self.profileImage.frame; 
UIView *sv = self.profileImage.superview; 
self.profileImage.alpha = 0.0f; 
rect = [self.scrollview convertRect:rect fromView:sv]; 
self.profileImage.frame = rect; 
[self.scrollview addSubview:self.profileImage]; 
[UIView animateWithDuration:0.0f animations:^{ 
    self.profileImage.alpha = 1.0f; 
}]; 
0

我使用无闪烁这方面的工作:

CGRect rect = self.profileImage.frame; 
UIView *sv = self.profileImage.superview; 
CGRect convertedRect = [self.scrollview convertRect:rect fromView:sv]; 
[UIView animateWithDuration:0.0 animations:^(void){ 
    [self.profileImage setAlpha:0.0]; 
    [self.profileImage setFrame:convertFrame]; 
    [self.scrollview addSubview:self.profileImage]; 
    [self.profileImage setAlpha:1.0]; 
}]; 
0

在我的情况是,addSubview在后台线程中执行的问题。 您需要在主队列上执行更改,它应该可以正常工作。

尝试

dispatch_async(dispatch_get_main_queue(), ^{ 
    CGRect rect = self.profileImage.frame; 
    UIView *sv = self.profileImage.superview; 
    [self.scrollview addSubview:self.profileImage]; 
    rect = [self.scrollview convertRect:rect fromView:sv]; 
    self.profileImage.frame = rect; 
} 
相关问题