【发布时间】:2014-09-25 13:15:54
【问题描述】:
我遇到了以下问题。
假设我有自己的图像视图类(为方便起见,我修剪了所有代码,只包含导致问题的代码)。该类继承自UIView 并覆盖drawRect。这是我的drawRect 的外观(代码在 Xamarin 中,但很容易理解)
public override void Draw(RectangleF rect)
{
base.Draw(rect);
CGContext context = UIGraphics.GetCurrentContext();
if (Image != null)
{
var imageRect = getAspectFillRect(rect, Image.Size);
context.DrawImage(imageRect, Image.CGImage);
}
else
{
this.BackgroundColor.SetFill();
context.FillRect(this.Bounds);
}
}
这段代码简单地绘制设置为Image属性的图像,通过计算矩形来模拟UIImageView的方面填充选项,该矩形将使用这行代码getAspectFillRect(rect, Image.Size);以方面填充模式显示图像
我也有 UICollectionView 自定义布局和自定义单元格。每个UICollectionViewCell UI 都在一个xib 文件中定义,在那里我设置了所有必要的约束,并且我还拥有用于显示图像的自定义视图。对于界面生成器中的该视图,我已将内容模式设置为“Aspect Fill”。自定义UICollectionViewLayout 以单元格扩展的方式制作(您将很快看到该示例)。所以单元格内的图像也应该缩放,并且因为我设置了“Aspect Fill”选项,它不应该调用我的自定义视图的drawRect,而应该只是缩放已经绘制的内容。但事实并非如此!
LOOK HERE 观看演示所发生情况的视频。
您可能会看到里面的图像没有与细胞一起生长。问题是,在我的自定义UIView 的单元格扩展动画开始drawRect 之前,使用最终将在动画之后建立的矩形进行调用。所以我得到了一个生涩的动画。在我的自定义布局代码中,我只是在更新单元格的约束后调用LayoutIfNeeded。我不打电话给setNeedsDisplay,所以我不明白为什么我的drawRect 会被调用。
为了实验,我用UIImageView 替换了我的自定义图像视图,我将它的内容模式设置为“Aspect Fill”,LOOK HERE 发生了什么。是的!有效。所以我想问题不在于自定义UICollectionView 布局,而在于我的自定义图像绘制类。
我应该考虑什么?我应该如何处理这种情况?有任何想法吗? 谢谢!
【问题讨论】:
标签: ios uiview xamarin drawrect uiviewcontentmode