
Un recadrage d'image pour iOS comme dans l'application Contacts avec le support de l'orientation du paysage.
RSKIMageCroPper nécessite iOS 12.0 ou version ultérieure.
Pour ajouter le package RSKImageCropper à votre projet XCode, sélectionnez Fichier> Packages Swift> Ajouter une dépendance du package et entrez l'URL du référentiel.
https://github.com/ruslanskorb/RSKImageCropper.git
Ajoutez le pod RSKImageCropper à votre podfile.
pod 'RSKImageCropper'
Exécutez pod install à partir du terminal, puis ouvrez le fichier .xcworkspace de votre application pour lancer Xcode.
Importez l'en-tête RSKImageCropper.h . En règle générale, cela devrait être écrit comme #import <RSKImageCropper/RSKImageCropper.h>
Ajoutez le projet ruslanskorb/RSKImageCropper à votre cartouche.
github "ruslanskorb/RSKImageCropper"
Exécutez carthage update , puis suivez les étapes supplémentaires nécessaires pour ajouter les frameworks iOS et / ou Mac dans votre projet.
Importez le framework / module RSKimageCroPper.
@import RSKImageCropper#import <RSKImageCropper/RSKImageCropper.h> Importez l'en-tête de classe.
# import < RSKImageCropper/RSKImageCropper.h >Créez simplement un contrôleur de vue pour le recadrage d'images et définissez le délégué.
- ( IBAction )onButtonTouch:(UIButton *)sender
{
UIImage *image = [UIImage imageNamed: @" image " ];
RSKImageCropViewController *imageCropViewController = [[RSKImageCropViewController alloc ] initWithImage: image];
imageCropViewController. delegate = self;
[ self .navigationController pushViewController: imageCropViewController animated: YES ];
} RSKImageCropViewControllerDelegate fournit trois méthodes de délégué. Pour les utiliser, implémentez le délégué dans votre contrôleur de vue.
@interface ViewController () <RSKImageCropViewControllerDelegate>Implémentez ensuite les fonctions du délégué.
// Crop image has been canceled.
- ( void )imageCropViewControllerDidCancelCrop:(RSKImageCropViewController *)controller
{
[ self .navigationController popViewControllerAnimated: YES ];
}
// The original image has been cropped. Additionally provides a rotation angle used to produce image.
- ( void )imageCropViewController:(RSKImageCropViewController *)controller
didCropImage:(UIImage *)croppedImage
usingCropRect:( CGRect )cropRect
rotationAngle:( CGFloat )rotationAngle
{
self. imageView . image = croppedImage;
[ self .navigationController popViewControllerAnimated: YES ];
}
// The original image will be cropped.
- ( void )imageCropViewController:(RSKImageCropViewController *)controller
willCropImage:(UIImage *)originalImage
{
// Use when `applyMaskToCroppedImage` set to YES.
[SVProgressHUD show ];
} RSKImageCropViewControllerDataSource fournit trois méthodes de source de données. La méthode imageCropViewControllerCustomMaskRect: demande la source de données pour un RECT personnalisé pour le masque. La méthode imageCropViewControllerCustomMaskPath: demande la source de données pour un chemin personnalisé pour le masque. La méthode imageCropViewControllerCustomMovementRect: demande la source de données pour un rect personnalisé dans lequel l'image peut être déplacée. Pour les utiliser, implémentez la source de données dans votre contrôleur de vue.
@interface ViewController () <RSKImageCropViewControllerDataSource>Implémentez ensuite les fonctions de source de données.
// Returns a custom rect for the mask.
- ( CGRect )imageCropViewControllerCustomMaskRect:(RSKImageCropViewController *)controller
{
CGSize aspectRatio = CGSizeMake ( 16 . 0f , 9 . 0f );
CGFloat viewWidth = CGRectGetWidth (controller. view . frame );
CGFloat viewHeight = CGRectGetHeight (controller. view . frame );
CGFloat maskWidth;
if ([controller isPortraitInterfaceOrientation ]) {
maskWidth = viewWidth;
} else {
maskWidth = viewHeight;
}
CGFloat maskHeight;
do {
maskHeight = maskWidth * aspectRatio. height / aspectRatio. width ;
maskWidth -= 1 . 0f ;
} while (maskHeight != floor (maskHeight));
maskWidth += 1 . 0f ;
CGSize maskSize = CGSizeMake (maskWidth, maskHeight);
CGRect maskRect = CGRectMake ((viewWidth - maskSize. width ) * 0 . 5f ,
(viewHeight - maskSize. height ) * 0 . 5f ,
maskSize. width ,
maskSize. height );
return maskRect;
}
// Returns a custom path for the mask.
- (UIBezierPath *)imageCropViewControllerCustomMaskPath:(RSKImageCropViewController *)controller
{
CGRect rect = controller. maskRect ;
CGPoint point1 = CGPointMake ( CGRectGetMinX (rect), CGRectGetMaxY (rect));
CGPoint point2 = CGPointMake ( CGRectGetMaxX (rect), CGRectGetMaxY (rect));
CGPoint point3 = CGPointMake ( CGRectGetMaxX (rect), CGRectGetMinY (rect));
CGPoint point4 = CGPointMake ( CGRectGetMinX (rect), CGRectGetMinY (rect));
UIBezierPath *rectangle = [UIBezierPath bezierPath ];
[rectangle moveToPoint: point1];
[rectangle addLineToPoint: point2];
[rectangle addLineToPoint: point3];
[rectangle addLineToPoint: point4];
[rectangle closePath ];
return rectangle;
}
// Returns a custom rect in which the image can be moved.
- ( CGRect )imageCropViewControllerCustomMovementRect:(RSKImageCropViewController *)controller
{
if (controller. rotationAngle == 0 ) {
return controller. maskRect ;
} else {
CGRect maskRect = controller. maskRect ;
CGFloat rotationAngle = controller. rotationAngle ;
CGRect movementRect = CGRectZero ;
movementRect. size . width = CGRectGetWidth (maskRect) * fabs ( cos (rotationAngle)) + CGRectGetHeight (maskRect) * fabs ( sin (rotationAngle));
movementRect. size . height = CGRectGetHeight (maskRect) * fabs ( cos (rotationAngle)) + CGRectGetWidth (maskRect) * fabs ( sin (rotationAngle));
movementRect. origin . x = CGRectGetMinX (maskRect) + ( CGRectGetWidth (maskRect) - CGRectGetWidth (movementRect)) * 0 . 5f ;
movementRect. origin . y = CGRectGetMinY (maskRect) + ( CGRectGetHeight (maskRect) - CGRectGetHeight (movementRect)) * 0 . 5f ;
movementRect. origin . x = floor ( CGRectGetMinX (movementRect));
movementRect. origin . y = floor ( CGRectGetMinY (movementRect));
movementRect = CGRectIntegral (movementRect);
return movementRect;
}
} Construisez et exécutez le projet RSKImageCropperExample dans Xcode pour voir RSKImageCropper en action. Amusez-vous. Fourche et envoi des demandes de traction. Découvrez les crochets pour la personnalisation.
RSKImageCropper ne nécessite pas de manifeste de confidentialité. Selon les informations reçues d'Apple, nous devons éviter d'ajouter un manifeste de confidentialité vide à nos cadres.
Ruslan Skorb
Ce projet est disponible sous la licence MIT. Voir le fichier de licence pour plus d'informations. L'attribution en liant la page du projet est appréciée.