私は達成したい:
UIImageView
の端に合わないようにUIImageView
にインセットします結論:画像を特定のサイズ以上に引き伸ばさずに、UIImageView
のタッチ領域を増やしたいです。
絵コンテを通して可能ですか?誰もプログラムでそれを行う方法を教えてくれないのですか?
UIButton
を介して同様の機能を実現し、ストーリーボードを介して画像インセットを設定することはできますが、UIImageView
を使用してそのようなことを見つけることはできません。
指定されたメソッドを使用して 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))
タッチ可能な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];
私のコード
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
を追加してから、UIImageView
内にUIView
を好きなように追加して追加できます。また、ジェスチャーをUIImageView
でのみ影響させる場合は、UserInteractionEnableをyesにするか、ジェスチャーを全体の場合、ジェスチャーをUIView
全体に追加できます
1つのオプションは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
}
次の結果を生成します。