【问题标题】:Insets to UIImageView?UIImageView 的插图?
【发布时间】:2015-11-25 01:56:28
【问题描述】:

我想实现:

  • 缩放以填充图像视图的模式
  • 插入到UIImageView 以便图像 不符合UIImageView 的边缘

底线:我想增加UIImageView 的触摸区域,而不会将图像拉伸到超过一定尺寸。

可以通过情节提要吗?如果没有,谁能告诉如何以编程方式进行操作?

我可以通过UIButton 和通过情节提要设置图像插入来实现类似的功能,但我在UIImageView 中找不到任何此类功能。

【问题讨论】:

  • 您是否考虑在运行时更改图像的大小而不实际影响原始图像?可以吗?
  • 如果您的图像视图较低,这会改变比例并像素化您的图像,相反,如果您愿意重新考虑,我可以发布答案
  • 你可以发帖看看能不能用..

标签: ios iphone uiimageview storyboard


【解决方案1】:

您可以先添加UIView,然后在UIView 中添加您的UIImageView,并使用您喜欢的任何填充,如果您希望您的手势仅在UIImageView 中受到影响,请将其设为 UserInteractionEnable为 yes 或者如果您希望手势是整体的,那么您可以将手势添加到整个 UIView

【讨论】:

    【解决方案2】:

    看起来你想要一个可触摸的 imageView,那么为什么不使用带有 image 和 imageEdgeInsets 的 UIButton 呢?

    UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom];
    [b setFrame:someFrame];
    [b setImage:img forState:UIControlStateNormal];
    b.imageEdgeInsets = UIEdgeInsetsMake(20, 20, 20, 20);
    [b addTarget:self action:@selector(imageClicked:) forControlEvents:UIControlEventTouchUpInside];
    

    【讨论】:

    • 太棒了我喜欢使用按钮向图像添加插入功能的想法。 +1
    • 这工作正常,直到 iOS 再次改变按钮的外观/感觉并突然在其中添加边框或背景,这样它们就不再只是看起来像未经修饰的图像了。
    • 绝对是一个解决方案。不错!
    【解决方案3】:

    使用here给出的方法:

    UIImage *image= [MyUtil imageWithImage:[UIImage imageNamed:@"MyImage"] scaledToSize:CGSizeMake(80, 80)];
    
    UIImageView* imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    imgView.contentMode = UIViewContentModeCenter;
    [imgView setImage:image];
    

    现在您的插图变为 100-80 即 20 。

    这是一种为 UIImageView 提供插图的解决方法。欢迎提供更好的答案。

    【讨论】:

      【解决方案4】:

      您可以将插图添加到 UIImage 而不是 UIImageView

      斯威夫特 4

      let imageView = UIImageView() 
      imageView.contentMode = .scaleAspectFill
      imageView.image = UIImage(named: "example")?.withAlignmentRectInsets(UIEdgeInsets(top: -4, left: 0, bottom: -4, right: 0))
      

      【讨论】:

      • 我更正了语法,但这实际上不起作用
      • 效果非常好。不过,我发现我必须添加负插图才能使图像更小。
      • 在纸面上看起来不错,但对我没有影响,无论是 UIEdgeInset 参数的负值还是正值。是的,我正在使用 contentMode .scaleAspectFill
      • 我刚刚又测试了一遍,手动设置imageView帧好像没有效果。当imageView 使用自动布局设置时,它可以工作。
      • 我遇到了这个解决方案对我不起作用的问题。问题是我的图像对其父图像具有顶部、底部、尾随和前导约束。修复是只有“对齐中心 x”和“对齐中心 y”包含可用于此 imageView。所以 imageView 可以计算自己的严格尺寸,将 insets 计算在内。
      【解决方案5】:

      我的代码

      • 减去插图:较小的图像
      • 加插图:大图

      Swift4

      private lazy var imageView: UIImageView = {
          let view = UIImageView()
          view.contentMode = .scaleAspectFit
          let insetValue: CGFloat = -8
          view.image = image.withAlignmentRectInsets(UIEdgeInsets(top: insetValue, left: insetValue, bottom: insetValue, right: insetValue))
          return view
      }()
      

      【讨论】:

        【解决方案6】:

        尝试像这样在 UIView 中使用 UIImage ;

        【讨论】:

        • 请详细说明。
        • 在 UIView 中绘制 UIImage 并使用自动布局将 UIImage 限制为您想要的大小
        • 谢谢。通常的解决方案只会导致大量问题,这可以按预期工作。
        【解决方案7】:

        一种选择是使用withAlignmentRectInsets,但它不适用于图层边框。

        另一种方法是使用resizableImage(withCapInsets: resizingMode: .stretch),您希望对较小的图像使用正插入值。

        示例代码:

        private func setupQRImageView() -> UIImageView {
            let imageView = UIImageView()
            imageView.contentMode = .scaleAspectFit
            imageView.layer.borderColor = Default.imageBorderColor.cgColor
            imageView.layer.borderWidth = 4.0
            imageView.layer.cornerRadius = 6.0
            let imageInset: CGFloat = 8.0
            imageView.image = UIImage(named: "QR")?.resizableImage(withCapInsets: UIEdgeInsets(top: imageInset, left: imageInset, bottom: imageInset, right: imageInset), resizingMode: .stretch)
            return imageView
        }
        

        产生以下结果:

        【讨论】:

          【解决方案8】:

          别受苦,试试这个:

          尝试了一段时间后,我找到了这个解决方案:

          extension UIImage {
          
              func withInset(_ insets: UIEdgeInsets) -> UIImage? {
                  let cgSize = CGSize(width: self.size.width + insets.left * self.scale + insets.right * self.scale,
                                      height: self.size.height + insets.top * self.scale + insets.bottom * self.scale)
          
                  UIGraphicsBeginImageContextWithOptions(cgSize, false, self.scale)
                  defer { UIGraphicsEndImageContext() }
          
                  let origin = CGPoint(x: insets.left * self.scale, y: insets.top * self.scale)
                  self.draw(at: origin)
          
                  return UIGraphicsGetImageFromCurrentImageContext()?.withRenderingMode(self.renderingMode)
              }
          }
          

          使用示例:

          let margin:CGFloat = 16
          self.imageView.image = image?.withInset(UIEdgeInsets(top: margin, left: margin, bottom: margin, right: margin))
          

          Source

          【讨论】:

          • 这里的所有答案,这是唯一有效的答案。谢谢。
          • 这项工作,但删除 * self.scale 更好
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-23
          • 1970-01-01
          相关资源
          最近更新 更多