UIImageView的插图?

Sar*_*glt 38 iphone storyboard uiimageview ios

我想实现:

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

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

是否可以通过故事板?如果没有,任何人都可以通过编程方式告诉他们如何做

我可以UIButton通过故事板设置图像插图来实现类似的功能,但我找不到任何这样的东西UIImageView.

Bum*_*Koo 44

您可以添加插入UIImage而不是UIImageView.

斯威夫特4

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

  • 我更正了语法,但这实际上不起作用 (3认同)
  • 我遇到了这个解决方案对我不起作用的问题。问题是我的图像对其父级有顶部、底部、尾部和前导约束。修复方法是只有“对齐中心 x”和“对齐中心 y”包含可用于此 imageView。所以 imageView 可以计算它自己的严格大小,将插图纳入计数。 (3认同)
  • 效果很好。我发现我必须放置负片以使图像变小。 (2认同)
  • 纸面上看起来不错,但对我来说没有任何影响,无论“UIEdgeInset”参数的负值还是正值。是的,我正在使用 contentMode `.scaleAspectFill`。 (2认同)
  • 我只是再次测试了一下,当您手动设置`imageView`框架时,它似乎没有任何作用。当使用自动布局设置`imageView`时,它可以工作。 (2认同)

Sar*_*glt 28

使用此处给出的方法:

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];
Run Code Online (Sandbox Code Playgroud)

现在你的插图变成100-80即20.

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


Mar*_*Him 23

看起来你想要一个可触摸的imageView,为什么不使用带图像和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];
Run Code Online (Sandbox Code Playgroud)

  • 太棒了,我喜欢使用按钮向图像添加插图功能的想法。+1 (2认同)
  • 这种工作正常,直到iOS再次改变按钮的外观/感觉并突然将边框或背景放入其中,这样它们就不再只是看起来像是朴素的图像了. (2认同)

sht*_*kgm 11

我的密码

  • 负插图:较小的图像
  • 加上插图:大图

迅捷4

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
}()
Run Code Online (Sandbox Code Playgroud)


Ped*_*llo 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)
    }
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

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

来源

  • 所有答案都在这里,这是唯一有效的答案。谢谢。 (3认同)

Nik*_*ach 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
}
Run Code Online (Sandbox Code Playgroud)

产生以下结果:

带有边框和填充插图的 UIImageView


Sah*_*Roy 5

您可以添加UIView,然后再添加你的UIImageViewUIView用任何你喜欢的填充,如果你希望你的姿态,只有在得到受影响UIImageView,使其UserInteractionEnable为yes或者,如果你想的手势是整个然后你可以将手势添加到整体UIView


Ion*_*onz 5

尝试像这样在 UIView 中使用 UIImage 进行解决;

在此输入图像描述