2014-02-27 103 views
2

在我的观点之一,我有一个底栏。点击此视图可在屏幕中途将临时购物车动画化。现在,在临时表中没有任何项目的情况下,我将显示一个没有数据叠加层,它只是一个带有空白购物车图像和下方文本的视图。动画自定义视图半边屏幕中的图像 - 突然动画

问题是:当此表动画展开和折叠时,在动画过程中无数据叠加看起来不太好。看起来,图像也在缩小/扩大,直到临时表视图停止动画。

所以,我试图通过玩临时表视图的alpha,而这种动画发生时,看起来并不那么糟糕。但是这也没有帮助。最后有一个突然的闪光。

有什么建议吗?

self.temporaryTable.backgroundView = self.noDataOverlay; 

[UIView animateWithDuration:0.5 animations:^{ 
    self.temporaryTable.alpha = 0.5; 
} completion:^(BOOL finished) { 
    self.temporaryTable.alpha = 1.0; 
}]; 

这里是我的绘制图像代码:

- (void)drawRect:(CGRect)iRect scalingImage:(BOOL)iShouldScale { 
     CGRect aRect = self.superview.bounds; 
     // Draw our image 
     CGRect anImageRect = iRect; 
     if (self.image) { 
      //scale the image based on the height 
      anImageRect = CGRectZero; 
      anImageRect.size.height = self.image.size.height; 
      anImageRect.size.width = self.image.size.width; 
    #ifdef ACINTERNAL 
      if (iShouldScale) { 
       anImageRect = [self aspectFittedRect:anImageRect max:aRect]; 
      } else { 
       anImageRect.origin.x = (iRect.size.width/2) - (anImageRect.size.width/2); 
       anImageRect.origin.y = kTopMargin; 
      } 
    #else 
      anImageRect.origin.x = (iRect.size.width/2) - (anImageRect.size.width/2); 
      anImageRect.origin.y = kTopMargin; 
    #endif 
      if (self.shouldCenterImage) 
       anImageRect.origin.y = (iRect.size.height/2) - (anImageRect.size.height/2); 

      [self.image drawInRect:anImageRect]; 
     } else { 
      anImageRect.origin.y = (iRect.size.height/6); 
      anImageRect.size.height = (iRect.size.height/6); 
     } 

     // Draw our title and message 
     if (self.title) { 
      CGFloat aTop = anImageRect.origin.y + anImageRect.size.height + kSpacer; 
      CGFloat aWidth = aRect.size.width; 
      UIColor *aColor = [UIColor colorWithRed:96/256.0 green:106/256.0 blue:122/256.0 alpha:1]; 
      [aColor set];  
      CGRect aTextRect = CGRectMake(0, aTop, aWidth, kTitleHeight * 2); 
      UIFont *aTitleFont = [UIFont boldSystemFontOfSize:kTitleFontSize]; 
      [self.title drawInRect:aTextRect withFont:aTitleFont lineBreakMode:NSLineBreakByClipping alignment:NSTextAlignmentCenter]; 

      if (self.subTitle) { 
       UIFont *aSubTitleFont = [UIFont systemFontOfSize:kSubTitleFontSize]; 
       aTextRect = CGRectMake(0, aTop+kSpacer, aWidth, kTitleHeight); 
       [self.subTitle drawInRect:aTextRect withFont:aSubTitleFont lineBreakMode:NSLineBreakByClipping alignment:NSTextAlignmentCenter]; 
      } 
     } 
    } 


- (void)addToView:(UIView *)iView { 
    // setting a unique tag number here so that if the user has any other tag there should not be a conflict 
    UIView *aView = [iView viewWithTag:699]; 
    if (aView) { 
     [aView removeFromSuperview]; 
    } 
    self.tag = 699; 
    [iView addSubview:self]; 
} 


- (void)removeView { 
    [super removeFromSuperview]; 
} 


-(void)setViewFrame:(CGRect) iFrame { 
    CGRect aRect = self.frame; 
    aRect.size.width = iFrame.size.width; 
    aRect.size.height = iFrame.size.height; 
    self.frame = aRect; 
    [self setNeedsDisplay]; 
} 


- (CGRect)aspectFittedRect:(CGRect)iRect max:(CGRect)iMaxRect { 
    float anOriginalAspectRatio = iRect.size.width/iRect.size.height; 
    float aMaxAspectRatio = iMaxRect.size.width/iMaxRect.size.height; 

    CGRect aNewRect = iMaxRect; 
    if (anOriginalAspectRatio > aMaxAspectRatio) { // scale by width 
     aNewRect.size.height = iMaxRect.size.width * iRect.size.height/iRect.size.width; 
    } else { 
     aNewRect.size.width = iMaxRect.size.height * iRect.size.width/iRect.size.height; 
    } 
    aNewRect.origin.y = (iMaxRect.size.height - aNewRect.size.height)/2.0; 
    aNewRect.origin.x = (iMaxRect.size.width - aNewRect.size.width)/2.0; 

    return CGRectIntegral(aNewRect); 
} 

回答

2

一种可能性是固定问题,即一个事实,即空的购物车图像展开/折叠的观点激发。没有看到你的代码很难解决这个问题,但在我自己的代码中,我所做的就是将UIImageView的contentMode设置为UIViewContentModeBottom。这会使图像保持相同的大小,即使包含它的图像视图可能会随着动画的一部分而增长和缩小。

+0

这听起来很有前途,正是我所期待的。让我试试这个。 Upvoting! – Abhinav

+0

显然我们没有使用UIImageView。我们正在使用核心图形绘制它。我们在核心图形中有contentMode吗? – Abhinav

+0

即使您正在使用核心图形,您也必须以某种方式将图像插入界面。如果您使用自定义的UIView,则答案是_ content_mode,但细节取决于您的绘图代码,但仍未显示。 – matt

2

你看到闪光灯,因为你动画阿尔法高达0.5和动画完成,然后当你把它设置为从0.51.0。只是动画阿尔法高达1.0

这里
[UIView animateWithDuration:0.5 
       animations:^ 
{ 
    self.temporaryTable.alpha = 1.0; 
}]; 
+0

试过这个。当桌子上来时,它看起来不太好,我可以看到它背后的景象。这是因为阿尔法正在改变。有没有其他方法可以避免图像内部图像的膨胀/缩小? Upvoting! – Abhinav