iOS 는 재단 상자 와 그림 재단 기능 을 실현 합 니 다.

그림 처리 에서 자주 사용 하 는 그림 재단 은 바로 재단 상 자 를 통 해 그림 재단 의 구역 을 확인 한 다음 에 이 구역 의 그림 을 자 르 는 것 입 니 다.오늘 은 이 루어 졌 습 니 다.사실 그림 재단 자체 가 어렵 지 않 습 니 다.주요 재단 상자 의 포장 은 시간 이 좀 걸 렸 습 니 다.주요 기능 은 네 개의 각 크기 를 끌 수 있 지만 부모 보 기 를 초과 해 서 는 안 됩 니 다.네 개의 단 방향 크기 를 끌 면 부모 보 기 를 초과 해 서 는 안 됩 니 다.중간 부분 을 드래그 하여 크기 를 바 꾸 지 않 고 부모 보 기 를 초과 할 수 없습니다.다음은 주요 코드 를 열거 합 니 다.
네 개의 뿔 처리 코드:

-(void)btnPanGesture:(UIPanGestureRecognizer*)panGesture
{
 UIView *vw = panGesture.view;
 CGRect oldFrame = self.frame;
 CGRect oldIntersectRect = CGRectIntersection(self.frame, self.superview.bounds);

 CGPoint transport = [panGesture translationInView:vw];
 if (vw.tag == 4) {
 self.width = self.preFrame.size.width + transport.x;
 self.height = self.preFrame.size.height + transport.y;
 }
 else if(vw.tag == 3)
 {
 self.x = self.preFrame.origin.x + transport.x;
 self.width = self.preFrame.size.width - transport.x;
 self.height = self.preFrame.size.height + transport.y;
 }
 else if(vw.tag == 2)
 {
 self.width = self.preFrame.size.width + transport.x;
 self.y = self.preFrame.origin.y + transport.y;
 self.height = self.preFrame.size.height - transport.y;
 }
 else if(vw.tag == 1)
 {
 self.x = self.preFrame.origin.x + transport.x;
 self.width = self.preFrame.size.width - transport.x;
 self.y = self.preFrame.origin.y + transport.y;
 self.height = self.preFrame.size.height - transport.y;
 }
 if (panGesture.state == UIGestureRecognizerStateEnded) {
 self.preFrame = self.frame;
 }
 if (self.width < MinWidth || self.height < MinHeight) {
 self.frame = oldFrame;
 }
 CGRect newFrame = self.frame;
 if (newFrame.size.width * newFrame.size.height > oldFrame.size.height * oldFrame.size.width) {

 CGRect newIntersectRect = CGRectIntersection(self.frame, self.superview.bounds);
 if (newFrame.size.width * newFrame.size.height > newIntersectRect.size.width * newIntersectRect.size.height) {
 self.frame = oldFrame;
 }
 }
 self.preCenter = self.center;
}
나 는 부모 보기에 보 이 는 frame 의 교 집합 부분의 면적 을 통 해 부모 보 기 를 초과 하 는 지 여 부 를 판단 한다.
네 변 의 제어 코드:

-(void)viewPanGesture:(UIPanGestureRecognizer*)panGesture
{
 UIView *vw = panGesture.view;
 CGRect oldFrame = self.frame;
 CGRect oldIntersectRect = CGRectIntersection(self.frame, self.superview.bounds);

 CGPoint transport = [panGesture translationInView:vw];
 if (vw.tag == 1) {
 self.y = self.preFrame.origin.y + transport.y;
 self.height = self.preFrame.size.height - transport.y;
 }
 else if(vw.tag == 2)
 {
 self.x = self.preFrame.origin.x + transport.x;
 self.width = self.preFrame.size.width - transport.x;
 }
 else if(vw.tag == 3)
 {
 self.height = self.preFrame.size.height + transport.y;
 }
 else if(vw.tag == 4)
 {
 self.width = self.preFrame.size.width + transport.x;
 }
 if (panGesture.state == UIGestureRecognizerStateEnded) {
 self.preFrame = self.frame;
 }
 if (self.width < MinWidth || self.height < MinHeight) {
 self.frame = oldFrame;

 }
 self.preCenter = self.center;
 CGRect newFrame = self.frame;
 if (newFrame.size.width * newFrame.size.height > oldFrame.size.height * oldFrame.size.width) {

 CGRect newIntersectRect = CGRectIntersection(self.frame, self.superview.bounds);
 if (oldIntersectRect.size.width * oldIntersectRect.size.height >= newIntersectRect.size.width * newIntersectRect.size.height) {
 self.frame = oldFrame;
 self.preCenter = self.preCenter;
 }

 }

}
중간 부분 이동 제어 코드:

-(void)contentViewPanGestureAction:(UIPanGestureRecognizer*)panGesture
{
 CGPoint transport = [panGesture translationInView:self];
 CGRect oldFrame = self.frame;
 CGRect oldIntersectRect = CGRectIntersection(self.frame, self.superview.bounds);
 CGFloat oldMj = oldIntersectRect.size.width * oldIntersectRect.size.height;

 self.center = CGPointMake(self.preCenter.x + transport.x, self.preCenter.y + transport.y);

 if (panGesture.state == UIGestureRecognizerStateEnded) {

 self.preCenter = self.center;
 }
 CGRect newIntersectRect = CGRectIntersection(self.frame, self.superview.bounds);
 CGFloat newMj = newIntersectRect.size.width * newIntersectRect.size.height;

 if (newMj < oldMj) {
 self.frame = oldFrame;
 self.preCenter = self.center;
 }
}
커팅 상자 가 실 현 된 핵심 코드 는 위 와 같 습 니 다.개인 적 으로 가장 처리 하기 어 려 운 것 은 부모 보 기 를 초과 하 는 것 에 대한 제어 입 니 다.부모 보 기 를 초과 하지 않도록 하 는 것 입 니 다.개인 적 으로 는 하위 보기 와 부모 보기 의 교차 부분의 면적 변 화 를 통 해 부모 보 기 를 초과 하 는 지 여 부 를 알 수 있 습 니 다.만약 에 부모 보 기 를 초과 하면 이전의 frame 로 물 러 갑 니 다.다른 좋 은 방법 이 있 는 지 모 르 겠 습 니 다.있 으 면 같이 소통 할 수 있어 요.
그림 커팅 부분
코드 는 다음 과 같 습 니 다:

-(void)cropImg
{
 CGRect cropFrame = self.cropView.frame;
 CGFloat orgX = cropFrame.origin.x * (self.img.size.width / self.imgView.frame.size.width);
 CGFloat orgY = cropFrame.origin.y * (self.img.size.height / self.imgView.frame.size.height);
 CGFloat width = cropFrame.size.width * (self.img.size.width / self.imgView.frame.size.width);
 CGFloat height = cropFrame.size.height * (self.img.size.height / self.imgView.frame.size.height);
 CGRect cropRect = CGRectMake(orgX, orgY, width, height);
 CGImageRef imgRef = CGImageCreateWithImageInRect(self.img.CGImage, cropRect);

 CGFloat deviceScale = [UIScreen mainScreen].scale;
 UIGraphicsBeginImageContextWithOptions(cropFrame.size, 0, deviceScale);
 CGContextRef context = UIGraphicsGetCurrentContext();
 CGContextTranslateCTM(context, 0, cropFrame.size.height);
 CGContextScaleCTM(context, 1, -1);
 CGContextDrawImage(context, CGRectMake(0, 0, cropFrame.size.width, cropFrame.size.height), imgRef);
 UIImage *newImg = UIGraphicsGetImageFromCurrentImageContext();
 CGImageRelease(imgRef);
 UIGraphicsEndImageContext();

 ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
 [library toolWriteImageToSavedPhotosAlbum:newImg.CGImage metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
 if(error)
 {
 JGLog(@"    ");
 }
 } groupName:@"    "];
}
CGContextDrawImage 함수 의 좌표계 와 UIKIt 의 좌표계 가 위아래 로 뒤 바 뀌 는 것 을 주의해 야 합 니 다.좌표계 에 대해 다음 과 같이 처리 해 야 합 니 다.

CGContextTranslateCTM(context, 0, cropFrame.size.height);
CGContextScaleCTM(context, 1, -1);
효과 보기:

편집 한 그림:

이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.

좋은 웹페이지 즐겨찾기