插入 UIImageView?
Insets to UIImageView?
我想实现:
- 缩放以填充图像视图的模式
- 插入
UIImageView
以便图像
不符合UIImageView
的边缘
底线:我想增加 UIImageView
的触摸区域而不将图像拉伸到一定尺寸以上。
可以通过故事板实现吗?如果没有,谁能告诉我如何以编程方式做到这一点?
我可以通过 UIButton
和通过故事板设置图像插入来实现类似的功能,但我找不到 UIImageView
的任何此类功能。
您可以先添加一个 UIView
,然后在 UIView
中添加您的 UIImageView
,并根据您的喜好添加任何填充,如果您只想让您的手势受到影响在 UIImageView
中,将其 UserInteractionEnable 设置为 yes 或者如果您希望手势处于整体状态,则可以将手势添加到整体 UIView
看起来你想要一个可触摸的 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];
使用给出的方法 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 提供插图的解决方法。欢迎更好的回答。
您可以将插图添加到 UIImage
而不是 UIImageView
。
Swift 4
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.image = UIImage(named: "example")?.withAlignmentRectInsets(UIEdgeInsets(top: -4, left: 0, bottom: -4, right: 0))
我的代码
- 减去插图:较小的图像
- 加插图:大图
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
}()
尝试像这样在 UIView 中处理 UIImage ;
一个选项是使用 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
}
产生以下结果:
别受罪,试试这个:
经过一段时间的尝试,我找到了这个解决方案:
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))
我想实现:
- 缩放以填充图像视图的模式
- 插入
UIImageView
以便图像 不符合UIImageView
的边缘
底线:我想增加 UIImageView
的触摸区域而不将图像拉伸到一定尺寸以上。
可以通过故事板实现吗?如果没有,谁能告诉我如何以编程方式做到这一点?
我可以通过 UIButton
和通过故事板设置图像插入来实现类似的功能,但我找不到 UIImageView
的任何此类功能。
您可以先添加一个 UIView
,然后在 UIView
中添加您的 UIImageView
,并根据您的喜好添加任何填充,如果您只想让您的手势受到影响在 UIImageView
中,将其 UserInteractionEnable 设置为 yes 或者如果您希望手势处于整体状态,则可以将手势添加到整体 UIView
看起来你想要一个可触摸的 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];
使用给出的方法 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 提供插图的解决方法。欢迎更好的回答。
您可以将插图添加到 UIImage
而不是 UIImageView
。
Swift 4
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.image = UIImage(named: "example")?.withAlignmentRectInsets(UIEdgeInsets(top: -4, left: 0, bottom: -4, right: 0))
我的代码
- 减去插图:较小的图像
- 加插图:大图
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
}()
尝试像这样在 UIView 中处理 UIImage ;
一个选项是使用 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
}
产生以下结果:
别受罪,试试这个:
经过一段时间的尝试,我找到了这个解决方案:
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))