文档章节

iO6 Programming pushing the limits 阅读笔记

云飞扬v5
 云飞扬v5
发布于 2015/11/09 08:13
字数 1185
阅读 56
收藏 0

目录

第一部分 iOS6新内容

第二部分 从每天工具中获取更多(介绍日常使用控件和框架的潜力)

第三部分 完成任务的正确工具(介绍不是那么常用的控件和框架)

第四部分 发挥到极限(深入理解iOS)

前言

本书不适合没有iOS基础和实践经验的读者,更适合那些已经开发了一个app有一定经验的读者。着重点更多在于为什么这么做,而不是如何实现。更多关注设计模式,如何设计,编写ios app,选择合适的工具来解决日常开发遇到的问题。

源码地址

The Code | iOS 7 Programming: Pushing the limits
http://iosptl.com/code/

 

iosptl/ios7ptl · GitHub 
https://github.com/iosptl/ios7ptl


 

iOS 绘图代码


Chapter 8 Better Drawing

绘制直线


#import "LineView.h"

@implementation LineView


- (void)drawRect:(CGRect)rect {

    CGContextRef context=UIGraphicsGetCurrentContext();

    CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);

    CGContextSetLineWidth(context, 3.0);
    // Draw 3pt horizontal line from {10,100} to {200,100}

    CGContextMoveToPoint(context, 10.0, 100.0);
    CGContextAddLineToPoint(context, 200.0, 100.0);
    CGContextStrokePath(context);


    // Draw 3pt horizontal line from {10,105.5} to {200,105.5}
    CGContextMoveToPoint(context, 10.0, 105.5);
    CGContextAddLineToPoint(context, 200.0, 105.5);
    CGContextStrokePath(context);

}


@end



vc中调用

  LineView *lineView=[[LineView alloc]initWithFrame:self.view.bounds];
  lineView.backgroundColor=[UIColor whiteColor];
  [self.view addSubview:lineView];


绘制贝赛尔曲线




#import "FlowerView.h"

@implementation FlowerView
- (void)drawRect:(CGRect)rect {
    CGSize size = self.bounds.size;
    CGFloat margin = 10;
    CGFloat radius = rint(MIN(size.height - margin,
                              size.width - margin) / 4);
    CGFloat xOffset, yOffset;
    CGFloat offset = rint((size.height - size.width) / 2);
    if (offset > 0) {
        xOffset = rint(margin / 2);
        yOffset = offset;
    }
    else {
        xOffset = -offset;
        yOffset = rint(margin / 2);
    }
    [[UIColor redColor] setFill];
    UIBezierPath *path = [UIBezierPath bezierPath];
    [path addArcWithCenter:CGPointMake(radius * 2 + xOffset,15)
                    radius:radius
                startAngle:-M_PI
                  endAngle:0
                 clockwise:YES];

    [path addArcWithCenter:CGPointMake(radius * 3 + xOffset,
                                       radius * 2 + yOffset)
                    radius:radius
                startAngle:-M_PI_2
                  endAngle:M_PI_2
                 clockwise:YES];
    [path addArcWithCenter:CGPointMake(radius*2+xOffset,
                                       radius*3+yOffset)
                    radius:radius
                startAngle:0
                  endAngle:M_PI clockwise:YES];

    [path addArcWithCenter:CGPointMake(radius*2+xOffset,
                                       radius*3+yOffset)
                    radius:radius
                startAngle:0
                  endAngle:M_PI
                 clockwise:YES];
    [path addArcWithCenter:CGPointMake(radius + xOffset,
                                       radius * 2 + yOffset)
                    radius:radius
                startAngle:M_PI_2
                  endAngle:-M_PI_2
                 clockwise:YES];
    [path closePath];
    [path fill];

 

}



在vc中调用

  FlowerView *flowerView=[[FlowerView alloc]initWithFrame:self.view.bounds];
  
  [self.view addSubview:flowerView];



绘制股票曲线图


效果图如下所示



#import "GraphView.h"


@implementation GraphView {
    dispatch_source_t _timer;
}
const CGFloat kXScale = 5.0;
const CGFloat kYScale = 100.0;
static inline CGAffineTransform
CGAffineTransformMakeScaleTranslate(CGFloat sx, CGFloat sy,
                                    CGFloat dx, CGFloat dy) {
    return CGAffineTransformMake(sx, 0.f, 0.f, sy, dx, dy);
}
- (void)awakeFromNib {
    [super awakeFromNib];
    [self setContentMode:UIViewContentModeRight];
    _values = [NSMutableArray array];
    __weak id weakSelf = self;

    //设定绘图的间隔时间
    double delayInSeconds = 0.25;
    _timer =
    dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0,
                           dispatch_get_main_queue());
    dispatch_source_set_timer(
                              _timer, dispatch_walltime(NULL, 0),
                              (unsigned)(delayInSeconds * NSEC_PER_SEC), 0);
    dispatch_source_set_event_handler(_timer, ^{
        [weakSelf updateValues];
    });
    dispatch_resume(_timer);
}
- (void)updateValues {
    double nextValue = sin(CFAbsoluteTimeGetCurrent())
    + ((double)rand()/(double)RAND_MAX);
    [self.values addObject:
     [NSNumber numberWithDouble:nextValue]];
    CGSize size = self.bounds.size;
    CGFloat maxDimension = MAX(size.height, size.width);
    NSUInteger maxValues =
    (NSUInteger)floorl(maxDimension / kXScale);
    if ([self.values count] > maxValues) {
        [self.values removeObjectsInRange:
         NSMakeRange(0, [self.values count] - maxValues)];
    }
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect {
    if ([self.values count] == 0) {
        return; }
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetStrokeColorWithColor(ctx,
                                     [[UIColor redColor] CGColor]);
    CGContextSetLineJoin(ctx, kCGLineJoinRound);
    CGContextSetLineWidth(ctx, 5);
    CGMutablePathRef path = CGPathCreateMutable();
    CGFloat yOffset = self.bounds.size.height / 2;
    CGAffineTransform transform =
    CGAffineTransformMakeScaleTranslate(kXScale, kYScale,
                                        0, yOffset);
    CGFloat y = [[self.values objectAtIndex:0] floatValue];
    CGPathMoveToPoint(path, &transform, 0, y);
    for (NSUInteger x = 1; x < [self.values count]; ++x) {
        y = [[self.values objectAtIndex:x] floatValue];
        CGPathAddLineToPoint(path, &transform, x, y);
    }
    CGContextAddPath(ctx, path);
    CGPathRelease(path);
    CGContextStrokePath(ctx);
}
@end


在vc中调用

需要创建一个xib文件和一了类,然后将xib的class设置为GraphView

  NSArray * nib = [[NSBundle mainBundle]loadNibNamed:@"GraphView"
                                                 owner:self options:nil] ;
    GraphView *graphView= [nib lastObject];
    [self.view addSubview:graphView];


对文字进行渲染



-(UIImage *)reverseImageForText:(NSString *)text{

    const size_t kImageWidth=200;
    const size_t kImageHeight=200;
    CGImageRef textImage=NULL;
    UIFont *font=[UIFont boldSystemFontOfSize:13.0];

    UIGraphicsBeginImageContext(CGSizeMake(kImageWidth, kImageHeight));
    [[UIColor redColor]set];
    [text drawInRect:CGRectMake(0, 0, kImageWidth, kImageHeight) 
    withAttributes:@{NSFontAttributeName:font}];

    textImage=UIGraphicsGetImageFromCurrentImageContext().CGImage;
    UIGraphicsEndImageContext();

    return [UIImage imageWithCGImage:textImage scale:1.0 orientation:UIImageOrientationDownMirrored];


}


调用

    
    UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 200, 200)];
    imageView.image= [self reverseImageForText:@"Hello World!"];
    imageView.backgroundColor=[UIColor lightGrayColor];
    [self.view addSubview:imageView];



iOS 需要重新绘制整个视图

setNeedsDisplay,如果只想绘制部分视图,可以使用CALayer


CGLayer高效的一种绘图

旋转的文字效果


#import "LayerView.h"

@implementation LayerView


// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {

        static CGLayerRef sTextLayer = NULL;
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        if (sTextLayer == NULL) {
            CGRect textBounds = CGRectMake(0, 0, 200, 100);
            sTextLayer = CGLayerCreateWithContext(ctx,
                                                  textBounds.size,
                                                  NULL);
            CGContextRef textCtx = CGLayerGetContext(sTextLayer);
            CGContextSetRGBFillColor (textCtx, 1.0, 0.0, 0.0, 1);
            UIGraphicsPushContext(textCtx);
            UIFont *font = [UIFont systemFontOfSize:13.0];
            [@"Pushing The Limits" drawInRect:textBounds withFont:font];
            UIGraphicsPopContext();
        }

            CGContextTranslateCTM(ctx, self.bounds.size.width / 2,
                                  self.bounds.size.height / 2);
            for (NSUInteger i = 0; i < 10; ++i) {
                CGContextRotateCTM(ctx, 2 * M_PI / 10);
                CGContextDrawLayerAtPoint(ctx,
                                          CGPointZero,
                                          sTextLayer);
            }

}


@end


调用代码

   LayerView *layerView=[[LayerView alloc]initWithFrame:self.view.bounds];
    layerView.backgroundColor=[UIColor whiteColor];

    [self.view addSubview:layerView];

效果图





UIView animation

frame位移的动画

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,strong) UIView *circleView;

@end

@implementation ViewController


- (void)viewDidLoad {
    [super viewDidLoad];
    self.circleView = [[UIView alloc] initWithFrame:
                       CGRectMake(100, 100, 20, 20)];
    self.circleView.center = CGPointMake(100, 20);
    self.circleView.backgroundColor=[UIColor redColor];
    [[self view] addSubview:self.circleView];
    UITapGestureRecognizer *g;
    g = [[UITapGestureRecognizer alloc]
         initWithTarget:self
         action:@selector(dropAnimate)];
    [[self view] addGestureRecognizer:g];
}

- (void)dropAnimate {
    [UIView animateWithDuration:3 animations:^{
        self.circleView.center = CGPointMake(100, 300);
    }];
}


UIView animation只提供基本的动画功能,不支持3d,更多效果需要使用core animation的CALayer


CALayer只负责绘图,不处理用户事件

 

 

tableview的内容

下拉刷新和上拉加载更多

下拉刷新可以用UIRefreshControl

 

上拉加载更多可以自己封装一个tableview的superClass在最后加上section,显示加载更多的内容

 

键盘遮挡的一种解决方法

通过接收键盘出现的通知,将tableview的高度减去键盘的高度。接收键盘消失的通知,加上键盘的高度,这样就OK。

 


 


© 著作权归作者所有

上一篇: iOS app 分层架构
下一篇: UITextFiled 总结
云飞扬v5
粉丝 14
博文 105
码字总数 67465
作品 0
金华
私信 提问
HTTP/2 Server Push

HTTP/2 Server Push The Go Programming Language Blog2017-03-2457 阅读 pushHttpSERVER Introduction HTTP/2 is designed to address many of the failings of HTTP/1.x. Modern web pages......

The Go Programming Language Blog
2017/03/24
0
0
Linux 系统编程笔记

Linux/Unix常用底层库 unistd.h unix standard stdlib.h standard library fcntl.h file control sys.h system stdio.h standard input/output dirent.h directory entries string.h string ......

海涛
2016/08/08
46
0
Language Descriptions(摘自 code complete)

Language Descriptions The development histories of some languages are interesting, as are their general capabilities. Here are descriptions of the most common languages in use t......

面码
2014/05/30
50
0
《Rapid GUI Programming with Python and Qt》读书笔记

一些唠叨 搜索pyqt资料的时候发现了这本《Rapid GUI Programming with Python and Qt》,试读了一下觉得非常适合我这种完全初次接触qt与pyqt的新手,尽管是英文读物,但是不算太难理解,读起...

Feng_Yu
2014/06/18
1K
1
强化学习——Q-Learning SARSA 玩CarPole经典游戏

Image from unsplash.com by Ferdinand Stöhr 前文我们讲了如何用Q-learning 和 SARSA 玩推小车上山的游戏,这篇文章我们探讨一下如何完成Carpole平衡杆的游戏。 同样的,为了方便与读者交流...

Hongtao洪滔
07/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
6
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
9
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
5
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
7
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
7
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部