【问题标题】:Borders don't adjust to Aspect Fit?边框不适应 Aspect Fit?
【发布时间】:2012-03-14 17:22:19
【问题描述】:

我正在以编程方式设置带边框的图像视图。我将imageView的内容模式设置为Aspect Fit,这样可以,但是边框还是原来的正方形。

代码:

CGRect imageViewRect = CGRectMake(left, top, 158, 119); 
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:imageViewRect];
        [imageView setContentMode:UIViewContentModeScaleAspectFit];
        [imageView setImage:image];
        [imageView.layer setBorderColor:[[UIColor blackColor] CGColor]];
        [imageView.layer setBorderWidth:3.0];

很明显,我希望黑色边框可以调整以适应宽高比,并在所有侧面环绕图像。相反,它保留在原始帧中,如下所示:

【问题讨论】:

    标签: objective-c ios


    【解决方案1】:

    使用从 this post 中的 Frank Schmitt 略微修改的方法,您可以添加一个方法来计算显示缩放到纵横比的图像所需的帧:

    - (CGRect)getFrameSizeForImage:(UIImage *)image inImageView:(UIImageView *)imageView {
    
        float hfactor = image.size.width / imageView.frame.size.width;
        float vfactor = image.size.height / imageView.frame.size.height;
    
        float factor = fmax(hfactor, vfactor);
    
        // Divide the size by the greater of the vertical or horizontal shrinkage factor
        float newWidth = image.size.width / factor;
        float newHeight = image.size.height / factor;
    
        // Then figure out if you need to offset it to center vertically or horizontally
        float leftOffset = (imageView.frame.size.width - newWidth) / 2;
        float topOffset = (imageView.frame.size.height - newHeight) / 2;
    
        return CGRectMake(leftOffset, topOffset, newWidth, newHeight);
    }
    

    您可以在设置 UIImageView 图像后调用它:

    CGRect frame = [self getFrameSizeForImage:imageView.image inImageView:imageView]; 
    

    最后,使用这个框架设置 UIImageView 的框架,偏移位置以适应宽度/高度的任何变化:

    CGRect imageViewFrame = CGRectMake(imageView.frame.origin.x + frame.origin.x, imageView.frame.origin.y + frame.origin.y, frame.size.width, frame.size.height);
    imageView.frame = imageViewFrame;
    

    【讨论】:

      【解决方案2】:

      我完成这项工作的最快方法:

      • 在 IB 中,我设置了两个 imageView,顶部的一个用于我的图像,一个在其下方用于边框,我可以只设置为纯色,也可以使用任何类型的图形资源

      然后在代码中,我将背景图片边框调整为比前景图片略大:

      float kBorderSize=5.0;
      CGRect imageRect=AVMakeRectWithAspectRatioInsideRect(imageView.image.size,imageView.frame);
      CGRect borderRect=CGRectMake(imageRect.origin.x-kBorderSize, imageRect.origin.y-kBorderSize, imageRect.size.width+2*kBorderSize, imageRect.size.height+2*kBorderSize);
      backgroundImage.frame=borderRect;
      

      它需要导入:

      #import <AVFoundation/AVUtilities.h>
      

      【讨论】:

        【解决方案3】:

        该边框在 imageView 上,而不是在图像上。要解决此问题,您可以将 UIImageView 的大小调整为与图像相同的大小(或者在缩小时与图像具有相同的宽度/高度比)或实际为图像本身添加边框。

        this SO question 中涵盖了这两种情况

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-17
          • 1970-01-01
          • 2011-03-28
          • 1970-01-01
          • 2016-12-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多