이미지 자르기


- (IBAction)CaptureAction:(id)sender {

    NSLog(@"캡쳐 버튼 눌렸습니다.");


        CGSize screenS = myImageView.frame.size;

        CGFloat delX = myImageView.image.size.width / screenS.width;

        CGFloat delY = myImageView.image.size.height / screenS.height;


        NSLog(@"myImageView.image.size.width : %f" ,myImageView.image.size.width );

        NSLog(@"myImageView.image.size.height : %f" ,myImageView.image.size.height );

        NSLog(@"screenS.width : %f" ,screenS.width );

        NSLog(@"screenS.height : %f" ,screenS.height );

        NSLog(@"delX : %f" ,delX );

        NSLog(@"delY : %f" ,delY );

    

        NSLog(@"viewFinder.frame.origin.x : %f" ,viewFinder.frame.origin.x );

        NSLog(@" viewFinder.frame.origin.y : %f" ,viewFinder.frame.origin.y );

        NSLog(@"viewFinder.bounds.size.width : %f" ,viewFinder.bounds.size.width );

        NSLog(@"viewFinder.bounds.size.height : %f" ,viewFinder.bounds.size.height );

    

        NSLog(@"***********************************************************************" );

    

        NSLog(@"viewFinder.frame.origin.x  * delX : %f" ,viewFinder.frame.origin.x * delX );

        NSLog(@" viewFinder.frame.origin.y * delY : %f" ,viewFinder.frame.origin.y * delY );

        NSLog(@"viewFinder.bounds.size.width * delX : %f" ,viewFinder.bounds.size.width * delX);

        NSLog(@"viewFinder.bounds.size.height  * delY : %f" ,viewFinder.bounds.size.height * delY );

    


    CGRect sourceRect = CGRectMake(viewFinder.frame.origin.x * delX, (viewFinder.frame.origin.y -110)* delY, viewFinder.bounds.size.width * delX, viewFinder.bounds.size.height * delY);

    CGImageRef imageRef = CGImageCreateWithImageInRect(myImageView.image.CGImage, sourceRect);

    UIImage *cropImage = [UIImage imageWithCGImage:imageRef];

    CGImageRelease(imageRef);


    ImageVC *imageVC = [[ImageVC alloc]init];

    imageVC.cropedimage = cropImage;

    [self presentViewController:imageVC animated:YES completion:nil];

    

}

UIpangesture로 UIView 옮기기& 특정 프레임 넘어가지 않게 설정



소스



#import "ViewController.h"


@interface ViewController (){

    

    //사진틀

    IBOutlet UIImageView *myImageView;

    //뷰파인더를 옮기기 전 위치

    CGPoint beforPoint;


    

    //뷰파인더

    UIView *viewFinder;

    //뷰파인더를 감싸고 있는 네 개의 점.

    UIView *leftTopPoint;

    UIView *rightTopPoint;

    UIView *leftDownPoint;

    UIView *rightDownPoint;

    

    

    UIBezierPath *blackPath;    //검은색 블러

    UIBezierPath *framePath;    //포커스

    CAShapeLayer *fillLayer;

    

}


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

   //1.

    blackPath = [UIBezierPath bezierPathWithRect:self.view.frame];  //흐리게 블러 처리할 부분 : View 전체 지정

    

        //이미지뷰의 제일 왼쪽 모서리 구하기

        float startXpoint =  myImageView.frame.origin.x;

        float startYpoint =  myImageView.frame.origin.y;

    

    //뷰파인더

    viewFinder = [[UIView alloc] initWithFrame:CGRectMake(startXpoint, startYpoint, 100, 100)];

    viewFinder.backgroundColor = [UIColor clearColor];

    //viewFinder.center = self.view.center;

    viewFinder.layer.borderColor = [UIColor lightGrayColor].CGColor;

    viewFinder.layer.borderWidth= 1.0f;

    [self.view addSubview:viewFinder];

    

    framePath = [UIBezierPath bezierPathWithRect:viewFinder.frame];

    [blackPath appendPath:framePath];

    blackPath.usesEvenOddFillRule = YES;

    

    

    //오버레이뷰 : 약간 어둡게

    fillLayer = [CAShapeLayer layer];

    fillLayer.path = blackPath.CGPath;                                       //1.번에서 지정한 범위 그대로 설정

    fillLayer.fillRule = kCAFillRuleEvenOdd;

    fillLayer.fillColor = [UIColor blackColor].CGColor;               //검은색 바탕

    fillLayer.opacity = 0.4;                                                            //약간 흐리게

    [self.view.layer addSublayer:fillLayer];                                 //루트뷰 레이어에 오버레이뷰 추가

    

    

    //뷰파인더 위치 이동 제스쳐 이벤트

    UIPanGestureRecognizer *panResizeGestureViewFinder =[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(resizeTranslateViewFinder:)];

    [viewFinder addGestureRecognizer:panResizeGestureViewFinder];

    

}




//파인더뷰 드래그

-(void)resizeTranslateViewFinder:(UIPanGestureRecognizer *) recognizer{

    

    //드래그 후 위치값

    CGPoint afterPoint = [recognizer locationInView:viewFinder.superview];

    float finderX =  viewFinder.frame.origin.x;

    float finderY = viewFinder.frame.origin.y;

//    float beforX = beforPoint.x;

//    float beforY = beforPoint.y;

    float afterX = afterPoint.x;

    float afterY = afterPoint.y;

//    NSLog(@"finderX : %f  ,  finderY: %f" ,finderX , finderY);

//    NSLog(@"beforX : %f  ,  beforY: %f" ,beforX , beforY);

//    NSLog(@"afterX : %f  ,  afterY: %f" ,afterX , afterY);

//

//

//

        if ([recognizer state] == UIGestureRecognizerStateBegan) {

            NSLog(@"시작");

            viewFinder.center = afterPoint;                                 //뷰파인더 재할당

            [self setTransParentViewFinderSetting];                 //뷰파인더 셋팅

            beforPoint = [recognizer locationInView:viewFinder.superview];

            //[viewFinder setNeedsDisplay];

        }else if([recognizer state] == UIGestureRecognizerStateChanged){

            NSLog(@"중간");

            //뷰 파인더가 이미지 뷰 가이드라인 넘어가지 않게 설정

            [self actionViewFinderGuideLine:finderX and:finderY and:afterX and:afterY and :afterPoint];

            

        }else if ([recognizer state] == UIGestureRecognizerStateEnded ){

            NSLog(@"종료");

              //뷰 파인더가 이미지 뷰 가이드라인 넘어가지 않게 설정

           [self actionViewFinderGuideLine:finderX and:finderY and:afterX and:afterY and :afterPoint];

    }


};



////뷰파인더(투명색) 위치 설정을 위한 메소드

-(void) setTransParentViewFinderSetting {

    //검은색배경 위치와 오버레이뷰 해제

    [blackPath removeAllPoints];

    [fillLayer removeFromSuperlayer];

    //검은색 바탕화면 다시 셋팅

    blackPath = [UIBezierPath bezierPathWithRect:self.view.frame];

    

    

    //드래그된 뷰파인더 위치를 framepath에(위치경로) 대입

    framePath = [UIBezierPath bezierPathWithRect:viewFinder.frame];

    

    //뷰파인더(투명) 경로를 검은색 바탕화면 경로에 더해주기

    [blackPath appendPath:framePath];

    blackPath.usesEvenOddFillRule = YES;

    

    //오버레이뷰 : 약간 어둡게

    fillLayer = [CAShapeLayer layer];

    fillLayer.path = blackPath.CGPath;                                       //1.번에서 지정한 범위 그대로 설정

    fillLayer.fillRule = kCAFillRuleEvenOdd;

    fillLayer.fillColor = [UIColor blackColor].CGColor;               //검은색 바탕

    fillLayer.opacity = 0.4;                                                            //약간 흐리게

    [self.view.layer addSublayer:fillLayer];                                 //루트뷰 레이어에 오버레이뷰 추가

    

}




  //뷰 파인더가 이미지 뷰 가이드라인 넘어가지 않게 설정

-(void)actionViewFinderGuideLine : (float) finderX and:(float)finderY and:(float)afterX and:(float)afterY and:(CGPoint)afterPoint{

    //*왼쪽테두리 넘지 못함

    if(finderX <= 0.0){

        viewFinder.center = CGPointMake(50, afterY);

        [self setTransParentViewFinderSetting];

        //왼쪽테두리 + 위쪽 테두리 넘지 못한다.

        if(finderY <= myImageView.frame.origin.y){

            viewFinder.center = CGPointMake(50, myImageView.frame.origin.y + 50);

            [self setTransParentViewFinderSetting];

        }

        //왼쪽테두리 + 아래쪽 테두리 넘지 못함.

        if((finderY+100) >= myImageView.frame.origin.y+myImageView.frame.size.height){

            viewFinder.center = CGPointMake(50,( myImageView.frame.origin.y+myImageView.frame.size.height) - 50);

            [self setTransParentViewFinderSetting];

        }

        

        //*위쪽 테두리 넘지 못한다.

    }else  if(finderY <= myImageView.frame.origin.y){

        viewFinder.center = CGPointMake(afterX, myImageView.frame.origin.y + 50);

        [self setTransParentViewFinderSetting];

        //위쪽 테두리 + 오른쪽 테두리 넘지 못함

        if((finderX+100) >= myImageView.frame.size.width){

            viewFinder.center = CGPointMake(myImageView.frame.size.width - 50, myImageView.frame.origin.y + 50);

            [self setTransParentViewFinderSetting];

        }

        //위쪽 테두리 + 왼쪽 테두리 넘지 못함

        if(finderX <= 0.0){

            viewFinder.center = CGPointMake(50, afterY);

            [self setTransParentViewFinderSetting];

        }

        

        //*오른쪽 테두리 넘지 못한다.

    }else if((finderX+100) >= myImageView.frame.size.width){

        viewFinder.center = CGPointMake(myImageView.frame.size.width - 50, afterY);

        [self setTransParentViewFinderSetting];

        //오른쪽 테두리 + 위쪽 테두리 넘지 못함

        if(finderY <= myImageView.frame.origin.y){

            viewFinder.center = CGPointMake(myImageView.frame.size.width - 50, myImageView.frame.origin.y + 50);

            [self setTransParentViewFinderSetting];

            

        }

        //오른쪽 테두리 + 아래쪽 테두리 넘지 못함

        if((finderY+100) >= myImageView.frame.origin.y+myImageView.frame.size.height){

            viewFinder.center = CGPointMake(myImageView.frame.size.width - 50,( myImageView.frame.origin.y+myImageView.frame.size.height) - 50);

            [self setTransParentViewFinderSetting];

        }

        

        //*아래쪽 테두리 넘지 못함

    }else if((finderY+100) >= myImageView.frame.origin.y+myImageView.frame.size.height){

        viewFinder.center = CGPointMake(afterX,( myImageView.frame.origin.y+myImageView.frame.size.height) - 50);

        [self setTransParentViewFinderSetting];

        

        //아래쪽 + 왼쪽 테두리 넘지 못함

        if(finderX <= 0.0){

            viewFinder.center = CGPointMake(50, afterY);

            [self setTransParentViewFinderSetting];

        }

        

        //아래쪽 + 오른쪽 테두리 넘지 못함

        if((finderX+100) >= myImageView.frame.size.width){

            viewFinder.center = CGPointMake(myImageView.frame.size.width - 50, afterY);

            [self setTransParentViewFinderSetting];

        }

        

        

    }else{

        viewFinder.center = afterPoint;                                 //뷰파인더 재할당

        [self setTransParentViewFinderSetting];

        // [viewFinder setNeedsDisplay];

    }

}



- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}



@end





일정시간이 지난 파일 자동 삭제하기



앱실행할때 호출

//일정 시간 지난 미디어 파일 지우기


   [self deleteOverDateMediaFile];



//삭제 기준 날짜 가져오기

-(float)getDeleteStandardDateSeconds{

    

    //기준이 되는 날짜

    // 1. 3일 전 날짜를 구함 -> 데이터 포멧 변환 -> string으로 변환 -> 초 로변환 (568393200.000000)

    NSDateComponents* deltaComps = [[NSDateComponents alloc] init];

    [deltaComps setDay: -3];

    NSDate* tomorrow = [[NSCalendar currentCalendar] dateByAddingComponents:deltaComps toDate:[NSDate date] options:0];

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    dateFormatter.dateFormat = @"yyyyMMdd";

    NSString *dateString = [dateFormatter stringFromDate:tomorrow];

    NSLog(@"날짜 스트링 타입 : %@" , dateString);

    NSDate *dateDate = [dateFormatter dateFromString:dateString];

    NSLog(@"날짜 데이트 타입 : %@" , dateDate);

    NSTimeInterval seconds = [dateDate timeIntervalSinceReferenceDate];

    NSLog(@"초로변환 : %f" , seconds);

    return seconds;

}


//일정 시간 지난 미디어 파일 지우기

-(void)deleteOverDateMediaFile{


   //삭제 기준이 되는 초로 변환된 데이터

    float deleteDateStandardSeconds = [self getDeleteStandardDateSeconds];

    [self startDeleteMediaFile:@"/video" deleteStandardSeconds:deleteDateStandardSeconds ];

    [self startDeleteMediaFile:@"/audio" deleteStandardSeconds:deleteDateStandardSeconds ];

    [self startDeleteMediaFile:@"/photo" deleteStandardSeconds:deleteDateStandardSeconds ];

}



//비디오, 오디오, 사진 파일 삭제

-(void) startDeleteMediaFile :(NSString *) fileName  deleteStandardSeconds:(float) second{

    //파일 매니져

    NSFileManager *fm = [NSFileManager defaultManager];

    

    //최종 문서  폴더

    NSArray *DocumentDrectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    

    NSString *bigDir = [DocumentDrectory[0] stringByAppendingFormat:@"%@",fileName];

    

    //디렉토리 존재여부

    if ([fm isWritableFileAtPath:bigDir] ) {

        NSLog(@" %@ Dir가 존재합니다." , bigDir);

    }else{

        NSLog(@" %@ Dir가 존재하지 않습니다." ,bigDir);

    }

    

    //폴더 안에 있는 날짜 폴더들

    NSError *err;

    NSArray *smallDateFileArray = [fm contentsOfDirectoryAtPath:bigDir error:&err];

    if (err == nil) {

        

        //날짜 폴더 개수별로 개수

        for (int i = 0 ; i < (unsigned long)[smallDateFileArray count]; i++) {


            

            NSString *folderPathToDelete = [bigDir stringByAppendingFormat:@"/%@/",[smallDateFileArray objectAtIndex:i] ];

            

            //String 폴더명 가져와서 날짜 타입으로 바꾸고 숫자로 바꿔주기

            NSString *dateFileNameString =   [smallDateFileArray objectAtIndex:i];

            NSDateFormatter *fileDateFormatter = [[NSDateFormatter alloc] init];

            [fileDateFormatter setDateFormat:@"yyyyMMdd"];

            NSDate *fileNameDate = [fileDateFormatter dateFromString:dateFileNameString];

            NSTimeInterval haveToDeleteSeconds = [fileNameDate timeIntervalSinceReferenceDate];

            NSLog(@"초로변환2 : %f" , haveToDeleteSeconds);

            

            //삭제기준 날짜와 비교해서 작으면 (앞의 날짜) 경로를 가져와서 삭제 해준다.

            if (second > haveToDeleteSeconds) {

                

                NSError *deleteErr;


               [[NSFileManager defaultManager] removeItemAtPath:folderPathToDelete error:&deleteErr];

               

                if (deleteErr != nil) {

                    NSLog(@"이전 파일 삭제 중 오류가 발생했습니다.");

                    return;

                }else{

                    NSLog(@"삭제 성공!");

                    NSLog(@"%@ 폴더는 3일이 지난 파일이기 때문에 삭제 했습니다." , dateFileNameString);

                    NSLog(@"삭제 경로 : %@ " , folderPathToDelete);

                }

            }

        }

    }

}



+ Recent posts

티스토리 툴바