
Um corte de imagem para iOS como no aplicativo de contatos com suporte para orientação da paisagem.
O RSKIMAGECROPPER requer iOS 12.0 ou posterior.
Para adicionar o pacote RSKImageCropper ao seu projeto Xcode, selecione Arquivo> Pacotes Swift> Adicionar dependência do pacote e insira o URL do repositório.
https://github.com/ruslanskorb/RSKImageCropper.git
Adicione o pod RSKImageCropper ao seu poder de pod.
pod 'RSKImageCropper'
Execute pod install no terminal e abra o arquivo .xcworkspace do aplicativo para iniciar o Xcode.
Importe o cabeçalho RSKImageCropper.h . Normalmente, isso deve ser escrito como #import <RSKImageCropper/RSKImageCropper.h>
Adicione o projeto ruslanskorb/RSKImageCropper ao seu arquivo Cart.
github "ruslanskorb/RSKImageCropper"
Execute carthage update e siga as etapas adicionais necessárias para adicionar as estruturas iOS e/ou Mac ao seu projeto.
Importe a estrutura/módulo RSKIMAGECROPPER.
@import RSKImageCropper#import <RSKImageCropper/RSKImageCropper.h> Importar o cabeçalho da classe.
# import < RSKImageCropper/RSKImageCropper.h >Basta criar um controlador de exibição para corte de imagem e definir o delegado.
- ( 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 fornece três métodos de delegados. Para usá -los, implemente o delegado em seu controlador de exibição.
@interface ViewController () <RSKImageCropViewControllerDelegate>Em seguida, implemente as funções delegadas.
// 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 fornece três métodos de fonte de dados. O método imageCropViewControllerCustomMaskRect: pede a fonte de dados para um recorde personalizado para a máscara. O método imageCropViewControllerCustomMaskPath: pede à fonte de dados um caminho personalizado para a máscara. O método imageCropViewControllerCustomMovementRect: pede a fonte de dados para um recorde personalizado no qual a imagem pode ser movida. Para usá -los, implemente a fonte de dados em seu controlador de exibição.
@interface ViewController () <RSKImageCropViewControllerDataSource>Em seguida, implemente as funções da fonte de dados.
// 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;
}
} Construa e execute o projeto RSKImageCropperExample no Xcode para ver RSKImageCropper em ação. Divirta-se. Fork e envie solicitações de puxar. Descubra ganchos para personalização.
RSKImageCropper não requer um manifesto de privacidade. De acordo com as informações recebidas da Apple, devemos evitar adicionar um manifesto de privacidade vazio às nossas estruturas.
Ruslan Skorb
Este projeto está disponível sob a licença do MIT. Consulte o arquivo de licença para obter mais informações. A atribuição vinculando -se à página do projeto é apreciada.