15-Quartz2D演練

圖片水印

  • 圖片水印就是在圖片的基礎(chǔ)上繪制一些文字或logo,最終生成一張新的圖片

  • 在viewDidLoad方法中生成圖片水印的步驟:

    1. 加載圖片

       UIImage *image = [UIImage imageNamed:@"小黃人"]; 
      
    • 手動(dòng)獲取上下文咪奖,之前的上下文都是在view的drawRect方法中獲取的(跟View相關(guān)聯(lián)的layer上下文)成箫,目前我們需要繪制圖片到新的圖片上,所以需要用到位圖上下文

    • 怎樣獲取位圖上下文呢腹殿?注意独悴,位圖上下文的獲取方式跟layer上下文不一樣,位圖上下文需要我們手動(dòng)創(chuàng)建

      // 開啟一個(gè)位圖上下文锣尉,注意位圖上下文跟view無(wú)關(guān)聯(lián)刻炒,所以不需要在drawRect.
      // size:位圖上下文的尺寸(新圖片的尺寸)
      // opaque: 不透明度 YES:不透明 NO:透明,通常我們一般都弄透明的上下文
      // scale:通常不需要縮放上下文自沧,取值為0坟奥,表示不縮放
      UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);
      
    • 繪制圖片水印

      // 1.繪制原生的圖片
      [image drawAtPoint:CGPointZero];
      
      // 2.給原生的圖片添加文字
      NSString *str = @"水印文字";
      
      // 創(chuàng)建字典屬性
      NSMutableDictionary *dict = [NSMutableDictionary dictionary];
      dict[NSForegroundColorAttributeName] = [UIColor redColor];
      dict[NSFontAttributeName] = [UIFont systemFontOfSize:20];
      
      [str drawAtPoint:CGPointMake(200, 528) withAttributes:dict];
      
  • 繪制貝瑟爾路徑

     UIBezierPath *path =[UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 300, 300)];
     [[UIColor redColor] set];
     [path stroke];
    
  • 底層實(shí)現(xiàn)

     // 1.獲取上下文(位圖上下文)
     CGContextRef ctx = UIGraphicsGetCurrentContext();
    
     // 2.描述路徑
     CGContextMoveToPoint(ctx, 50, 50);
    
     CGContextAddLineToPoint(ctx, 200, 200);
    
     [[UIColor redColor] set];
    
     // 3.渲染上下文
     CGContextStrokePath(ctx);
    
  • 生成一張圖片給我們,從上下文中獲取圖片拇厢,并將其顯示到UIImageView上

     UIImage *imageWater = UIGraphicsGetImageFromCurrentImageContext();
     self.imageView.image = imageWater;
    
  • 關(guān)閉上下文

     UIGraphicsEndImageContext();
    

圖片裁剪

  • 圖片裁剪是把正方形圖片進(jìn)行裁剪爱谁,并生成一張圓形的圖片
  • 裁剪無(wú)邊框的圖片
- (void)clipImage
{
    // 0.加載圖片
    UIImage *image = [UIImage imageNamed:@"阿貍頭像"];
    
    // 1.開啟位圖上下文,跟圖片尺寸一樣大
    UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);
    
    // 2.設(shè)置圓形裁剪區(qū)域孝偎,正切與圖片
    // 2.1創(chuàng)建圓形的路徑
    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    
    // 2.2把路徑設(shè)置為裁剪區(qū)域
    [path addClip];
    
    // 3.繪制圖片
    [image drawAtPoint:CGPointZero];
    
    // 4.從上下文中獲取圖片
    UIImage *clipImage = UIGraphicsGetImageFromCurrentImageContext();
    
    // 5.關(guān)閉上下文
    UIGraphicsEndImageContext();
    
    _imageView.image = clipImage;
}
  • 裁剪有邊框的圖片访敌,并將裁剪方法放到分類中去,以便他人的使用
+ (UIImage *)imageWithClipImage:(UIImage *)image borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)color
{
    // 圖片的寬度和高度
    CGFloat imageWH = image.size.width;
    
    // 設(shè)置圓環(huán)的寬度
    CGFloat border = borderWidth;
    
    // 圓形的寬度和高度
    CGFloat ovalWH = imageWH + 2 * border;
    
    // 1.開啟上下文
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(ovalWH, ovalWH), NO, 0);
    
    // 2.畫大圓
    UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, ovalWH, ovalWH)];
    
    [color set];
    
    [path fill];
    
    // 3.設(shè)置裁剪區(qū)域
    UIBezierPath *clipPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(border, border, imageWH, imageWH)];
    [clipPath addClip];
    
    // 4.繪制圖片
    [image drawAtPoint:CGPointMake(border, border)];
    
    // 5.獲取圖片
    UIImage *clipImage = UIGraphicsGetImageFromCurrentImageContext();
    
    // 6.關(guān)閉上下文
    UIGraphicsEndImageContext();
    
    return clipImage;
    
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // 圖片裁剪:把正方形圖片重新生產(chǎn)一張圓形的圖片
    
    // 圖片裁剪
    
    UIImage *image = [UIImage imageWithClipImage:[UIImage imageNamed:@"阿貍頭像"] borderWidth:1 borderColor:[UIColor redColor]];
    
    _imageView.image = image;
}

屏幕截屏

  • 屏幕截屏的代碼可以封裝到分類當(dāng)中
+ (UIImage *)imageWithCaputureView:(UIView *)view
{
    // 開啟位圖上下文
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0);
    
    // 獲取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 把控件上的圖層渲染到上下文衣盾,layer只能渲染寺旺,不能繪制
    [view.layer renderInContext:ctx];
    
    // 生成一張圖片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    // 關(guān)閉上下文
    UIGraphicsEndImageContext();
    
    return image;
}
  • 在viewDidLoad方法中調(diào)用分類,返回一個(gè)UIImage對(duì)象
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // 生成一張新的圖片
    
    UIImage *image =  [UIImage imageWithCaputureView:self.view];
    
    // image轉(zhuǎn)data
    // compressionQuality: 圖片質(zhì)量 1:最高質(zhì)量
    
     NSData *data = UIImageJPEGRepresentation(image,1);
    
    [data writeToFile:@"/Users/xiaomage/Desktop/view.png" atomically:YES];
    
}

圖片截取

  • 在viewDidLoad方法中給控制器View添加一個(gè)pan手勢(shì)
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    // 給控制器的view添加一個(gè)pan手勢(shì)
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    
    [self.view addGestureRecognizer:pan];
}
  • 在pan:方法中對(duì)手勢(shì)進(jìn)行處理
- (void)pan:(UIPanGestureRecognizer *)pan
{
    CGPoint endA = CGPointZero;
    
    if (pan.state == UIGestureRecognizerStateBegan) { // 一開始拖動(dòng)的時(shí)候
        
        // 獲取一開始觸摸點(diǎn)
      _startP = [pan locationInView:self.view];
        
    }else if(pan.state == UIGestureRecognizerStateChanged){ // 一直拖動(dòng)
        // 獲取結(jié)束點(diǎn)
         endA = [pan locationInView:self.view];
        
        CGFloat w = endA.x - _startP.x;
        CGFloat h = endA.y - _startP.y;
        
        // 獲取截取范圍
        CGRect clipRect = CGRectMake(_startP.x, _startP.y, w, h);

        // 生成截屏的view
        self.clipView.frame = clipRect;
        
    }else if (pan.state == UIGestureRecognizerStateEnded){

        // 圖片裁剪势决,生成一張新的圖片
        
        // 開啟上下文
        // 如果不透明阻塑,默認(rèn)超出裁剪區(qū)域會(huì)變成黑色,通常都是透明
        UIGraphicsBeginImageContextWithOptions(_imageV.bounds.size, NO, 0);
        
        // 使用貝瑟爾路徑徽龟,設(shè)置裁剪區(qū)域
       UIBezierPath *path =  [UIBezierPath bezierPathWithRect:_clipView.frame];
        
        [path addClip];
        
        // 獲取上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        
        // 把控件上的內(nèi)容渲染到上下文
        [_imageV.layer renderInContext:ctx];
        
        // 生成一張新的圖片
        _imageV.image = UIGraphicsGetImageFromCurrentImageContext();
        
        // 關(guān)閉上下文
        UIGraphicsEndImageContext();
        
        // 先移除
        [_clipView removeFromSuperview];
        // 截取的view設(shè)置為nil
        _clipView = nil;
        
    }
    
    // 獲取手指的偏移量
    // pan translationInView:(UIView *)
}
  • clipView的懶加載叮姑,僅當(dāng)clipView為空的時(shí)候才去創(chuàng)建,否則直接返回
- (UIView *)clipView{
    if (_clipView == nil) {
        UIView *view = [[UIView alloc] init];
        _clipView = view;
        
        view.backgroundColor = [UIColor blackColor];
        view.alpha = 0.5;
        
        [self.view addSubview:view];
    }
    
    return _clipView;
}

圖片擦除

  • 需要用到手勢(shì)操作
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
    
    [self.view addGestureRecognizer:pan];
}
  • pan方法根據(jù)用戶手指的位置進(jìn)行圖片擦除
- (void)pan:(UIPanGestureRecognizer *)pan
{
    // 獲取當(dāng)前點(diǎn)
    CGPoint curP = [pan locationInView:self.view];
    
    // 獲取擦除的矩形范圍
    CGFloat wh = 100;
    CGFloat x = curP.x - wh * 0.5;
    CGFloat y = curP.y - wh * 0.5;
    
    CGRect rect = CGRectMake(x, y, wh, wh);
    
    // 開啟上下文
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0);
    
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 控件的layer渲染上去
    [_imageView.layer renderInContext:ctx];
    
    // 擦除圖片
    CGContextClearRect(ctx, rect);
    
    // 生成一張圖片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    _imageView.image = image;
    
    // 關(guān)閉上下文
    UIGraphicsEndImageContext();

}

手勢(shì)解鎖的界面布局

  • 首先,在awakeFromNib中創(chuàng)建9個(gè)按鈕對(duì)象
// 加載完xib的時(shí)候調(diào)用
- (void)awakeFromNib
{
    // 創(chuàng)建9個(gè)按鈕
    for ( int i = 0; i < 9; i++) {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        
        [btn setImage:[UIImage imageNamed:@"gesture_node_normal"] forState:UIControlStateNormal];
        
        [btn setImage:[UIImage imageNamed:@"gesture_node_highlighted"] forState:UIControlStateSelected];
        
        [self addSubview:btn];
    }
}
  • 然后传透,在layoutSubviews方法中對(duì)創(chuàng)建的按鈕對(duì)象進(jìn)行布局操作
// 為什么要在這個(gè)方法布局子控件耘沼,因?yàn)橹灰徽{(diào)用這個(gè)方法,就表示父控件的尺寸確定
- (void)layoutSubviews
{
    [super layoutSubviews];
    
    NSUInteger count = self.subviews.count;
    int cols = 3;
    CGFloat x = 0;
    CGFloat y = 0;
    CGFloat w = 74;
    CGFloat h = 74;
    CGFloat margin = (self.bounds.size.width - cols * w) / (cols + 1);
    
    CGFloat col = 0;
    CGFloat row = 0;
    for (NSUInteger i = 0; i < count; i++) {
        UIButton *btn = self.subviews[i];
        // 獲取當(dāng)前按鈕的列數(shù)
        col = i % cols;
        row = i / cols;
        x = margin + col * (margin + w);
        y = row * (margin + w);
        
        btn.frame = CGRectMake(x, y, w, h);
        
    }
    
}

手勢(shì)解鎖的業(yè)務(wù)邏輯實(shí)現(xiàn)

  • 使用可變數(shù)組來(lái)存儲(chǔ)已經(jīng)選中的按鈕
@property (nonatomic, strong) NSMutableArray *selectedsBtn;

// 重寫get方法朱盐,對(duì)數(shù)組進(jìn)行懶加載
- (NSMutableArray *)selectedsBtn
{
    if (_selectedsBtn == nil) {
        _selectedsBtn = [NSMutableArray array];
    }
    
    return _selectedsBtn;
}
  • 重寫pan方法群嗤,對(duì)用戶的手勢(shì)進(jìn)行判斷,首先判斷觸摸點(diǎn)是否在按鈕上兵琳,然后當(dāng)用戶手指離開屏幕時(shí)還原界面
- (IBAction)pan:(UIPanGestureRecognizer *)pan
{
    // 獲取觸摸點(diǎn)
    _curP = [pan locationInView:self];
    
    // 判斷觸摸點(diǎn)在不在按鈕上
    for (UIButton *btn in self.subviews) {
        // 點(diǎn)在不在某個(gè)范圍內(nèi),并且按鈕沒(méi)有被選中
        if (CGRectContainsPoint(btn.frame, _curP) && btn.selected == NO) {
            // 點(diǎn)在按鈕上
            btn.selected = YES;
            
            // 保存到數(shù)組中
            [self.selectedsBtn addObject:btn];
            
        }
        
    }
    
    // 重繪
    [self setNeedsDisplay];
    
    
    if (pan.state == UIGestureRecognizerStateEnded) {
        
        // 創(chuàng)建可變字符串
        NSMutableString *strM = [NSMutableString string];
         // 保存輸入密碼
        for (UIButton *btn in self.selectedsBtn) {
            
            [strM appendFormat:@"%ld",btn.tag];
            
        }
        NSLog(@"%@",strM);
        
        // 還原界面
        
        // 取消所有按鈕的選中
        [self.selectedsBtn makeObjectsPerformSelector:@selector(setSelected:) withObject:@(NO)];
        
        // 清除畫線,把選中按鈕清空
        [self.selectedsBtn removeAllObjects];
    }
    
}
  • 根據(jù)被選中按鈕的數(shù)組狂秘,對(duì)界面進(jìn)行重繪操作
// 只要調(diào)用這個(gè)方法,就會(huì)把之前繪制的東西全部清掉躯肌,重新繪制
- (void)drawRect:(CGRect)rect
{
    // 沒(méi)有選中按鈕者春,不需要連線
    if (self.selectedsBtn.count == 0) return;
    
    // 把所有選中按鈕中心點(diǎn)連線
    UIBezierPath *path = [UIBezierPath bezierPath];
    
    NSUInteger count = self.selectedsBtn.count;
    // 把所有選中按鈕之間都連好線
    for (int i = 0; i < count; i++) {
        UIButton *btn = self.selectedsBtn[i];
        if (i == 0) {
            // 設(shè)置起點(diǎn)
            [path moveToPoint:btn.center];
        }else{
            [path addLineToPoint:btn.center];
        }
        
    }
    
    // 連線到手指的觸摸點(diǎn)
    [path addLineToPoint:_curP];
    
    [[UIColor greenColor] set];
    path.lineWidth = 10;
    path.lineJoinStyle = kCGLineJoinRound;
    [path stroke];
    
}

畫板

  • 根據(jù)數(shù)組中數(shù)據(jù)的類型,繪制圖片和線條
// 繪制圖形
// 只要調(diào)用drawRect方法就會(huì)把之前的內(nèi)容全部清空
- (void)drawRect:(CGRect)rect
{
    for (DrawPath *path in self.paths) {
        
        if ([path isKindOfClass:[UIImage class]]) {
            // 繪制圖片
            UIImage *image = (UIImage *)path;
            
            [image drawInRect:rect];
        }else{
            
            // 畫線
            [path.pathColor set];
            
            [path stroke];
        }
        
    }
}
  • 選擇照片清女,并實(shí)現(xiàn)代理方法钱烟,將選中的照片繪制到畫板上
#pragma mark - 選擇照片
- (IBAction)pickerPhoto:(id)sender {
    // 彈出系統(tǒng)的相冊(cè)
    // 選擇控制器(系統(tǒng)相冊(cè))
    UIImagePickerController *picekerVc = [[UIImagePickerController alloc] init];
    
    // 設(shè)置選擇控制器的來(lái)源
    // UIImagePickerControllerSourceTypePhotoLibrary 相冊(cè)集
    // UIImagePickerControllerSourceTypeSavedPhotosAlbum:照片庫(kù)
    picekerVc.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
    
    // 設(shè)置代理
    picekerVc.delegate = self;
    
    // modal
    [self presentViewController:picekerVc animated:YES completion:nil];
    
}

#pragma mark - UIImagePickerControllerDelegate
// 當(dāng)用戶選擇一張圖片的時(shí)候調(diào)用
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // 獲取選中的照片
    UIImage *image = info[UIImagePickerControllerOriginalImage];

    // 把選中的照片畫到畫板上
    
    _drawView.image = image;
    
    // dismiss
    [self dismissViewControllerAnimated:YES completion:nil];
}
  • 保存修改后的照片,相當(dāng)于截屏操作
#pragma mark - 保存
- (IBAction)save:(id)sender {
    
    // 截屏
    // 開啟上下文
    UIGraphicsBeginImageContextWithOptions(_drawView.bounds.size, NO, 0);
    
    // 獲取上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 渲染圖層
    [_drawView.layer renderInContext:ctx];
    
    // 獲取上下文中的圖片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    // 關(guān)閉上下文
    UIGraphicsEndImageContext();
    
    // 保存畫板的內(nèi)容放入相冊(cè)
    // image:寫入的圖片
    // completionTarget圖片保存監(jiān)聽(tīng)者
    // 注意:以后寫入相冊(cè)方法中嫡丙,想要監(jiān)聽(tīng)圖片有沒(méi)有保存完成拴袭,保存完成的方法不能隨意亂寫
    UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    
}

// 監(jiān)聽(tīng)保存完成,必須實(shí)現(xiàn)這個(gè)方法
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
     NSLog(@"保存圖片成功");
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末曙博,一起剝皮案震驚了整個(gè)濱河市拥刻,隨后出現(xiàn)的幾起案子糊啡,更是在濱河造成了極大的恐慌好乐,老刑警劉巖巾陕,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亿蒸,死亡現(xiàn)場(chǎng)離奇詭異糊探,居然都是意外死亡忘古,警方通過(guò)查閱死者的電腦和手機(jī)技竟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門窿凤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)睬捶,“玉大人黔宛,你說(shuō)我怎么就攤上這事∏苊常” “怎么了臀晃?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)介劫。 經(jīng)常有香客問(wèn)我徽惋,道長(zhǎng),這世上最難降的妖魔是什么座韵? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任险绘,我火速辦了婚禮踢京,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宦棺。我一直安慰自己瓣距,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布代咸。 她就那樣靜靜地躺著蹈丸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呐芥。 梳的紋絲不亂的頭發(fā)上逻杖,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音思瘟,去河邊找鬼荸百。 笑死,一個(gè)胖子當(dāng)著我的面吹牛潮太,可吹牛的內(nèi)容都是我干的管搪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼铡买,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了霎箍?” 一聲冷哼從身側(cè)響起奇钞,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漂坏,沒(méi)想到半個(gè)月后景埃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡顶别,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年谷徙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驯绎。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡完慧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出剩失,到底是詐尸還是另有隱情屈尼,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布拴孤,位于F島的核電站脾歧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏演熟。R本人自食惡果不足惜鞭执,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兄纺,春花似錦大溜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至旁蔼,卻和暖如春锨苏,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棺聊。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工伞租, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人限佩。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓葵诈,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親祟同。 傳聞我的和親對(duì)象是個(gè)殘疾皇子作喘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Quartz2D以及drawRect的重繪機(jī)制字?jǐn)?shù)1487 閱讀21 評(píng)論1 喜歡1一、什么是Quartz2D Q...
    PurpleWind閱讀 773評(píng)論 0 3
  • Quartz2D 簡(jiǎn)介 Quartz2D是二維(平面)的繪圖引擎(經(jīng)包裝的函數(shù)庫(kù)晕城,方便開發(fā)者使用泞坦。也就是說(shuō)蘋果幫我...
    iOS_Cqlee閱讀 632評(píng)論 0 2
  • 相關(guān)資源 棋盤和手勢(shì)解鎖 chess.gif gestureLock.gif GitHub粒子發(fā)射和復(fù)制圖層示例 ...
    asaBoat閱讀 437評(píng)論 0 1
  • 1. Quartz 2D 使用前須知:Quartz2D的API是純C語(yǔ)言的Quartz 2D是一個(gè)二維繪圖引擎,同...
    夏天不冷閱讀 387評(píng)論 0 0
  • “奴役”砖顷,是一個(gè)令人看到就恐懼和悲憫的詞贰锁,總令人想到鮮血和眼淚,更別提要一字一句地去讀那些悲慘的人和事了滤蝠。 科爾森...
    冷月寒鋒閱讀 205評(píng)論 0 0