思路是建一個UIView的子類,獲取划動出的矩形,用協議將矩形傳遞給代理對象,依據該矩形完成圖像數據的截取,並顯示出來。atom
截圖視圖類:spa
#import <UIKit/UIKit.h> @protocol UICutImgDelegate; @interface BIDCutView : UIView { CGPoint startPoint; CGRect targetRect; id <UICutImgDelegate> _delegate; } @property (assign , nonatomic) id delegate; @end @protocol UICutImgDelegate <NSObject> -(void)cutImgWithRect:(CGRect) aRect; -(void)clear; @end
#import "BIDCutView.h" @implementation BIDCutView @synthesize delegate=_delegate; - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } - (void)drawRect:(CGRect)rect { CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextSetLineWidth(ctx, 1.5); CGContextSetStrokeColorWithColor(ctx, [UIColor purpleColor].CGColor); CGFloat lengths[2] = {15.0,5.0}; CGContextSetLineDash(ctx, 2, lengths, 2); CGContextStrokeRect(ctx, targetRect); //畫虛線矩形 } -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { [self.delegate clear]; startPoint=[[touches anyObject] locationInView:self]; } -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { CGPoint currentPoint=[[touches anyObject] locationInView:self]; targetRect = CGRectMake(startPoint.x, startPoint.y, currentPoint.x-startPoint.x, currentPoint.y-startPoint.y); [self setNeedsDisplay]; } -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { if (self.delegate && [self.delegate respondsToSelector:@selector(cutImgWithRect:)]) { [self.delegate cutImgWithRect:targetRect]; } }
@end
視圖控制器:(做爲截圖視圖的代理對象)代理
#import <UIKit/UIKit.h> #import "BIDCutView.h" @interface BIDRootViewController : UIViewController <UICutImgDelegate> @end
#import "BIDRootViewController.h" #import "BIDSimpleTouchFun.h" #import "BIDDiscount.h" @implementation BIDRootViewController -(void)loadView { [super loadView];
//self.view=[[[BIDDrawViewalloc] initWithFrame:CGRectMake(0, 0, 320, 460)] autorelease];
BIDCutView *cutView=[[BIDCutView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)]; cutView.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"abc.jpg"]]; cutView.delegate = self; [self.view addSubview:cutView]; [cutView release]; } - (void)viewDidLoad { [super viewDidLoad]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } -(void)cutImgWithRect:(CGRect)aRect { UIImage *img=[UIImage imageNamed:@"abc.jpg"]; CGImageRef imgRef = img.CGImage; CGImageRef targetImgRef = CGImageCreateWithImageInRect(imgRef, aRect); //圖像的截取 UIImage *targetImg=[UIImage imageWithCGImage:targetImgRef]; UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, aRect.size.width, aRect.size.height)]; imgView.image = targetImg; //把截取得的圖像顯示到視圖中去 imgView.tag=1000; [self.view addSubview:imgView]; [imgView release]; } -(void)clear { UIImageView *imgView=(UIImageView *)[self.view viewWithTag:1000]; [imgView removeFromSuperview]; }
效果: code