web-dev-qa-db-fra.com

Des encarts à UIImageView?

Je voudrais réaliser:

  • Mettre à l'échelle pour remplir le mode d'affichage de l'image
  • Insère dans UIImageView pour que l'image ne rencontre pas les bords du UIImageView

Bottomline: Je veux augmenter la zone tactile du UIImageView sans étirer l'image au-delà d'une certaine taille.

Est-ce possible par le storyboard? Sinon, est-ce que quelqu'un peut dire comment le faire par programme?

Je peux obtenir des fonctionnalités similaires avec UIButton et en insérant une image dans le storyboard, mais je ne trouve rien de tel avec UIImageView.

37
Sarasranglt

En utilisant la méthode donnée ici :

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];

Maintenant, vos incrustations deviennent 100-80, à savoir 20.

Il s'agit d'une solution de contournement pour fournir des encarts à un UIImageView. De meilleures réponses sont les bienvenues.

27
Sarasranglt

Vous pouvez ajouter un insert à UIImage au lieu de UIImageView.

Swift 4

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

On dirait que vous voulez avoir une imageView tactile, alors pourquoi ne pas utiliser un UIButton avec image et imageEdgeInsets?

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];
21
MarkHim

Mon code

  • moins encart: image plus petite
  • plus encart: image plus grande

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
}()
9
Shota Nakagami

Essayez de travailler avec UIImage dans UIView comme ceci;

enter image description here

4
Ionz

Vous pouvez d'abord ajouter un UIView, puis votre UIImageView à l'intérieur du UIView avec un remplissage de ce que vous voulez, et si vous souhaitez que votre geste soit affecté uniquement dans UIImageView, définissez UserInteractionEnable sur yes ou si vous souhaitez que le geste soit complet, vous pouvez l'ajouter à l'ensemble UIView

4
Saheb Roy

Une option consiste à utiliser withAlignmentRectInsets, mais cela ne fonctionne pas avec la bordure de la couche.

Une autre méthode consiste à utiliser resizableImage(withCapInsets: resizingMode: .stretch) où vous souhaitez utiliser des valeurs d’encart positives pour des images plus petites.

Exemple de code:

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
}

Produit le résultat suivant:

UIImageView with a border and padded inset

1
Nikolay Derkach