Xamarin iOS 8,使用自动布局 - 调整图像大小,同时保持宽高比错误

时间:2016-03-02 14:44:35

标签: ios iphone ipad xamarin xamarin.ios

我在使用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

iPhone sample - Scale AspectFit in Portrait mode

Aspect Fit iPad

AspectFit iPad Portrait mode

  1. 我将内容模式更改为 ScaleAspectFill
  2. AspectFill iPhone纵向模式

    在iPhone上,它们在纵向模式下看起来没问题  enter image description here

    AspectFill iPad纵向模式

    他们看起来在这里切断,有时重叠。 enter image description here

    AspectFill iPad横向模式

    他们看起来在这里切断,有时会重叠。

    enter image description here

    我测试了在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;
    
        }
    

0 个答案:

没有答案