我在使用Xamarin iOS 8中的图像时遇到了挑战。我使用自动布局并启用了大小类。
我有一个表视图,我在服务器上显示不同的图像。图像的尺寸各不相同,但无论如何,我希望始终将它们调整大小以适应单元格的边界,如果它们的尺寸较小则不会扭曲它们。
这是我调用的函数,用于调整图像大小:
public static UIImage MaxResizeImage(UIImage sourceImage, float maxWidth, float maxHeight)
{
var sourceSize = sourceImage.Size;
var maxResizeFactor = Math.Min(maxWidth / sourceSize.Width, maxHeight / sourceSize.Height);
if (maxResizeFactor > 1)
return sourceImage;
var width = maxResizeFactor * sourceSize.Width;
var height = maxResizeFactor * sourceSize.Height;
UIGraphics.BeginImageContextWithOptions(new SizeF((float)width, (float)height), false, 2.0f);
sourceImage.Draw(new RectangleF(0, 0, (float)width, (float)height));
var resultImage = UIGraphics.GetImageFromCurrentImageContext();
UIGraphics.EndImageContext();
return resultImage;
}
挑战:
在单元格的UIImageView上使用 ScaleAspectFit 内容模式,
在iPhone上,如果图像小于屏幕宽度,则会有空格。
在iPad上,两侧都有空白区域。
Aspect Fit iPhone
Aspect Fit iPad
AspectFill iPhone纵向模式
AspectFill iPad纵向模式
AspectFill iPad横向模式
他们看起来在这里切断,有时会重叠。
我测试了在Facebook上上传相同的图像,无论图像大小如何,它都会根据宽度重新调整大小,同时保持宽高比。
无论设备如何,如何正确调整图像大小?什么内容模式适合?
编辑GetHeightForRow覆盖
这就是我计算每张图像高度的方法。
public override nfloat GetHeightForRow (UITableView tableView, NSIndexPath indexPath)
{
SampleCell cell = tableView.DequeueReusableCell (SampleCell.Key) as SampleCell;
if (cell == null) {
cell = new SampleCell ();
}
nfloat height = 0.0f;
try {
if (cell != null)
{
var _url = TableItems[indexPath.Row].Item4;
//call method to load the images
if (_url != null)
{
cell.cellImageView.SetImage(
url: new NSUrl(_url.AbsoluteUri),
placeholder: UIImage.FromBundle("sample.png"),
completedBlock: (image,error,type,url)=> {
if(image != null)
{
imageResizer = new ImageResizer(image);
imageResizer.RatioResize((float)tableView.Frame.Size.Width,(float)tableView.Frame.Size.Height);
UIImage resizedImage = imageResizer.ModifiedImage;
cell.cellImageView.Image = image;
}
}
);
height = cell.ContentView.SystemLayoutSizeFittingSize (UIView.UILayoutFittingCompressedSize).Height;
height += 1;
}
}
} catch (Exception ex) {
Console.WriteLine (ex.Message + ex.StackTrace);
}
//return 240f;
return height;
}