我有以下问题。
假设我有自己的图像视图类(为方便起见,我修剪了所有代码,只包含导致问题的代码)。该类继承自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
模拟 's aspect fill 选项的方式将图像设置为属性UIImageView
getAspectFillRect(rect, Image.Size);
我也有UICollectionView
自定义布局和自定义单元格。每个UICollectionViewCell
UI 都在一个 xib 文件中定义,在那里我设置了所有必要的约束,在那里我还有用于显示图像的自定义视图。对于界面生成器中的该视图,我已将内容模式设置为“Aspect Fill”。自定义UICollectionViewLayout
是以单元格扩展的方式进行的(您将很快看到该示例)。所以单元格内的图像也应该缩放,并且因为我设置了“Aspect Fill”选项,它不应该调用drawRect
我的自定义视图,而应该只是缩放已经绘制的内容。但事实并非如此!
看这里看演示发生了什么的视频。您可能会看到里面的图像没有与细胞一起生长。问题是,在drawRect
我的自定义的单元格扩展动画开始之前UIView
,使用 rect 调用该动画最终将在动画之后建立。所以我得到了一个生涩的动画。在我的自定义布局代码中,我只是LayoutIfNeeded
在更新单元格的约束后调用。我不打电话setNeedsDisplay
,所以我不明白为什么打电话给我drawRect
。
对于实验,我用 替换了我的自定义图像视图UIImageView
,我将它的内容模式设置为“Aspect Fill”,然后看这里发生了什么。是的!有效。所以我想问题不在于自定义UICollectionView
布局,而在于我的自定义图像绘制类。
我应该考虑什么?我应该如何处理这种情况?有任何想法吗?谢谢!