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);
효과 보기:편집 한 그림:
이상 은 본문의 전체 내용 이 므 로 여러분 의 학습 에 도움 이 되 기 를 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.