tips-1

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #8b84cf}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px 'Heiti SC Light'; color: #4cbf57}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #ffffff}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #4cbf57}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #ffffff; min-height: 21.0px}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #c2349b}p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #e44448}p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px 'Heiti SC Light'; color: #ffffff}p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #d28f5a}p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #4cbf57; min-height: 21.0px}p.p11 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px 'Heiti SC Light'; color: #d28f5a}span.s1 {font-variant-ligatures: no-common-ligatures}span.s2 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s3 {font-variant-ligatures: no-common-ligatures; color: #8b84cf}span.s4 {font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s5 {font-variant-ligatures: no-common-ligatures; color: #c2349b}span.s6 {font: 18.0px 'Heiti SC Light'; font-variant-ligatures: no-common-ligatures}span.s7 {font-variant-ligatures: no-common-ligatures; color: #4cbf57}span.s8 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures; color: #8b84cf}span.s9 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s10 {font-variant-ligatures: no-common-ligatures; color: #e44448}span.s11 {font: 18.0px 'Heiti SC Light'; font-variant-ligatures: no-common-ligatures; color: #ffffff}span.s12 {font: 18.0px 'Heiti SC Light'; font-variant-ligatures: no-common-ligatures; color: #e44448}span.s13 {font-variant-ligatures: no-common-ligatures; color: #d28f5a}

// 延迟0.25秒就会调用里面代码块的东西
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// codeing...
});
//添加一个定时器
[NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(update) userInfo:nil repeats:YES];

//创建CADisplayLink (当每一屏幕刷新就会调用 每一秒刷新60)
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(update)];
[link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

  1. //setNeedsDisplay它会调用drawRect,它并不是立马,只是设了一个标志,当下一次屏幕刷新的调用.
    [self setNeedsDisplay];

3.// UIGeometry.h
// UIKit
UIKIT_EXTERN const UIEdgeInsets UIEdgeInsetsZero;
UIKIT_EXTERN const UIOffset UIOffsetZero;

UIKIT_EXTERN NSString *NSStringFromCGPoint(CGPoint point);
UIKIT_EXTERN NSString *NSStringFromCGVector(CGVector vector);
UIKIT_EXTERN NSString *NSStringFromCGSize(CGSize size);
UIKIT_EXTERN NSString *NSStringFromCGRect(CGRect rect);
UIKIT_EXTERN NSString *NSStringFromCGAffineTransform(CGAffineTransform transform);
UIKIT_EXTERN NSString *NSStringFromUIEdgeInsets(UIEdgeInsets insets);
UIKIT_EXTERN NSString *NSStringFromUIOffset(UIOffset offset);

UIKIT_EXTERN CGPoint CGPointFromString(NSString *string);
UIKIT_EXTERN CGVector CGVectorFromString(NSString *string);
UIKIT_EXTERN CGSize CGSizeFromString(NSString *string);
UIKIT_EXTERN CGRect CGRectFromString(NSString *string);
UIKIT_EXTERN CGAffineTransform CGAffineTransformFromString(NSString *string);
UIKIT_EXTERN UIEdgeInsets UIEdgeInsetsFromString(NSString *string);
UIKIT_EXTERN UIOffset UIOffsetFromString(NSString *string);

@interface NSValue (NSValueUIGeometryExtensions)

  • (NSValue *)valueWithCGPoint:(CGPoint)point;
  • (NSValue *)valueWithCGVector:(CGVector)vector;
  • (NSValue *)valueWithCGSize:(CGSize)size;
  • (NSValue *)valueWithCGRect:(CGRect)rect;
  • (NSValue *)valueWithCGAffineTransform:(CGAffineTransform)transform;
  • (NSValue *)valueWithUIEdgeInsets:(UIEdgeInsets)insets;
  • (NSValue *)valueWithUIOffset:(UIOffset)insets NS_AVAILABLE_IOS(5_0);
  • (CGPoint)CGPointValue;
  • (CGVector)CGVectorValue;
  • (CGSize)CGSizeValue;
  • (CGRect)CGRectValue;
  • (CGAffineTransform)CGAffineTransformValue;
  • (UIEdgeInsets)UIEdgeInsetsValue;
  • (UIOffset)UIOffsetValue NS_AVAILABLE_IOS(5_0);

@end

4.// UIImage.h
// UIKit
UIKIT_EXTERN NSData *UIImagePNGRepresentation(UIImage *image); // return image as PNG. May return nil if image has no CGImageRef or invalid bitmap format
UIKIT_EXTERN NSData *UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality); // return image as JPEG. May return nil if image has no CGImageRef or invalid bitmap format. compression is 0(most)..1(least)

//如何把图片转换成二进流.
NSData *data = UIImagePNGRepresentation(newImage);
// UIImageJPEGRepresentation(<#UIImage *image#>, <#CGFloat compressionQuality#>)
[data writeToFile:@"/Users/gaoxinqiang/Desktop/newImage.png" atomically:YES];

5.设置父控件的hidden=yes,其子控件也会被隐藏
设置父控件的alpha<=0.01的时候,其子控件也会被影响 ,变得看不见

0.01的时候没事.
系统默认的UIView(用代码创建的UIView和拖出的都是,默认是clearcolor的background属性的,alpha>0.01)clearcolor的alpha>0.01,子控件不影响显示

理解:alpha>0.01透明但存在(不可穿透),alpha<=0.01类似不存在,皮之不存,毛之焉附(可以穿透).

系统默认的UIImageView是没有background属性的

6.如何开启一个图片上下文?
size:开启多大的上文
opaque:是否不透明//Yes的时候Context没有绘画内容的地方为黑色,No的时候为透明的
scale:缩放上下文.
UIGraphicsBeginImageContextWithOptions(image.size, YES, 0);

7.//判断一个点在不在某个区域当中
CGRectContainsPoint(btn.frame, point)
//-(BOOl)pointInSet...hitTest中调用

  1. transform:底层是通过找到需要形变对象的父类,调用父类的layoutSubviews,改变他的frame,bounds不会改变。因为frame能决定他在父控件显示的位置和尺寸。
    也就是说控件进过transform之后,只是改变了它在父类中的显示的位置和尺寸,但是他的实际大小(bounds)不会改变.所以如果把它render到context中,和没有进行过transform的时候是一样的.绘图只和size有关(而我们在开启context的时候通常传入bounds.size作为context的size),还有绘图模式比如drawAtPoint照着内容原来大小绘如context,drawInCGRect,把内容缩放绘入context指定的Rect,还有一种平铺的

static NSArray *b;
b=[NSArray arrayWithObjects:@{@"s":@"v"},@"s",@[@"s_---"], nil];
//forin以NSString *类型去取出了所有对象
for (NSString *a in b) {
NSLog(@"%@",a);
}
2015-09-14 23:12:26.160 06-画板[3242:21948] {
s = v;
}
2015-09-14 23:12:26.161 06-画板[3242:21948] s
2015-09-14 23:12:26.161 06-画板[3242:21948] (
"s_---"
)

10.typedef struct CGContext * CGContextRef;

11.截图
从view.layer render去context,然后从context的到image(UIGraphicsGetImageFromCurrentImageContext();),再把image写入dir
//用函数(UIPickerConter.h)写入相册或者用函数(UIImage.h)转为NSData再写入dir

11-1//写到系统相册当中(Album相册)

//注意,保存成功调用的方法必须得是
//- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
UIImageWriteToSavedPhotosAlbum(newImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
11-2//如何把图片转换成二进流.//第4点tips
NSData *data = UIImagePNGRepresentation(newImage);
// UIImageJPEGRepresentation(<#UIImage *image#>, <#CGFloat compressionQuality#>)
[data writeToFile:@"/Users/gaoxinqiang/Desktop/newImage.png" atomically:YES];

12.modal
//completion(presentViewController后执行代码块)
[self presentViewController:temp animated:YES completion:nil];
self dismissViewControllerAnimated:<#(BOOL)#> completion:<#^(void)completion#>

13.CGAffineTransform结构体(view实例.transform)结合frame完美表现View在其父View或者屏幕上的样子,设置控件形变(平移,旋转,缩放,等等)
typedef struct CGAffineTransform CGAffineTransform;
struct CGAffineTransform {
CGFloat a, b, c, d;
CGFloat tx, ty;
};
//frame +transform.

平移Translation(Translate)
旋转Rotation
缩放Scale
// sx:宽度缩放比例, sy:高度缩放比例
颠倒Invert

14./**文档中找到的
* The concrete subclasses of UIGestureRecognizer are the following:

UITapGestureRecognizer//轻点,敲击

UIPinchGestureRecognizer//捏合,用于缩放

UIRotationGestureRecognizer//旋转

UISwipeGestureRecognizer//轻扫

UIPanGestureRecognizer//拖动

UIScreenEdgePanGestureRecognizer//

UILongPressGestureRecognizer//长按
*/

15.-(void)pinch:(UIPinchGestureRecognizer *)pinch
{
//sx,sy都是pinch.scale(手势捏合只有一个两指头间距从开始到结束比例,同一手势累计)
//只有一个值所以手势捏合缩放,等比例,或者有人设计只是缩放宽高的一个
pinch.view.transform=CGAffineTransformScale(pinch.view.transform, pinch.scale, pinch.scale);
// 复位
pinch.scale = 1;
}
-(void)rotation:(UIRotationGestureRecognizer *)rotation
{
// 旋转图片
rotation.view.transform = CGAffineTransformRotate(rotation.view.transform, rotation.rotation);

// 复位,只要想相对于上一次旋转就复位
rotation.rotation = 0;

}
16.#warning ImageView默认是不能与用户交互的,改为能
self.imageV .userInteractionEnabled=YES;

17.-(void)layoutSubviews
{ [super layoutSubviews];
//在这里写了要进行形变的view的frame后,不能进行形变了,旋转可以但是左上角和右下角固定.
self.imageV.frame=self.bounds;
}

warning 记得UIGraphicsEndImageContext();

当自己的类(对象),需要别的类(对象)的数据,或者要改别的类属性时,或者因为事件发生需要使用别的类的方法的时候.在自己的类,设一个容器,存放别的类,就可以拿到别的类,实现目的,这时为了降低耦合,用代理容器,存别的类,用协议方法,实现数据交互.(非MVC中的相关类,父子对象控件父可以直接用对象容器,...)

20.@interface NSValue (CATransform3DAdditions)

  • (NSValue *)valueWithCATransform3D:(CATransform3D)t;

@property(readonly) CATransform3D CATransform3DValue;

@end

  1. //在C语言当中用的都是像素,我们这个地方加载@2x

//加载原始图片
UIImage *oriImage = [UIImage imageNamed:@"LuckyAstrology"];
UIImage *oriSelImage = [UIImage imageNamed:@"LuckyAstrologyPressed"];

//获取当前屏幕与像素坐标的比例
//一个点.x拉伸多少像素.x
CGFloat scale = [UIScreen mainScreen].scale;

CGFloat clipW = oriImage.size.width / 12 * scale;
CGFloat clipH = oriImage.size.height * scale;
CGFloat clipX = 0;
CGFloat clipY = 0;

//CGimgae(CG...)是c语言中的兼容OS 和iOS ,像素作为基本单位,UIIamge(iOS手机专用,以点作为基本单位)

//裁剪图片当中的某一块区域
CGRect rect = CGRectMake(clipX, clipY, clipW, clipH);
CGImageRef clipImage = CGImageCreateWithImageInRect(oriImage.CGImage, rect);
//把CGImageRef转成UIImage
UIImage *clipNewImage = [UIImage imageWithCGImage:clipImage];
23.UIView的详细显示过程

  • 当UIView需要显示时,它内部的层会准备好一个CGContextRef(图形上下文),然后调用delegate(这里就是UIView)的drawLayer:inContext:方法,并且传入已经准备好的CGContextRef对象。而UIView在drawLayer:inContext:方法中又会调用自己的drawRect:方法

  • 平时在drawRect:中通过UIGraphicsGetCurrentContext()获取的就是由层传入的CGContextRef对象,在drawRect:中完成的所有绘图都会填入层的CGContextRef中,然后被拷贝至屏幕

24.//拿当选中按钮的旋转角度.
CGAffineTransform transform = self.preBtn.transform;
// t' = [ cos(angle) sin(angle) -sin(angle) cos(angle) 0 0 ]
//atan2f(math.h反三角函数,传入两个边获得弧度,tan(...) sin cos)
// CGFloat angel = atan2f(transform.b, transform.a);
CGFloat angel = acosf(transform.a);
NSLog(@"%lf",angel);
//让ContentV倒着旋转回去.
self.contentV.transform = CGAffineTransformMakeRotation(angel);

25.[self.superview insertSubview:smallCircle belowSubview:self];
26.模拟器和真机的尺寸由启动图片决定

27.//修改transform,并不会改center,底层改的是frame

28.给layer设置图片.
layer.contents = (id)[UIImage imageNamed:@"阿狸头像"].CGImage;

29.#translation:每次手指移动产生的移动向量的累加
//手势的translationInView:self==translationInView:self.superview,这里传的参数self.superview和传self是一样的
//translation底层计算translation+=手指(这次位置改变后)的在self的位置-手指(这次位置改变前)在self的位置(向量)(总的相当于,所有改变以前的手指在self的位置和这次改变后手指在self的位置的两点向量)(或者总的相当于,所有改变以前的手指在self.super的位置和这次改变后手指在self.super的位置的两点向量,所以两个是一样的)
CGPoint po=[pan translationInView:self];
CGPoint pi=[pan translationInView:self.superview];
NSLog(@"po=%@,pi=%@",NSStringFromCGPoint(po),NSStringFromCGPoint(pi));

30.

父子对象控件父可以直接用对象容器拿到subview,子控件需要改变父控件的属性时,可以在自己的属性中加一个模型属性,然后由父控件去取这个模型设置自己的内容,如系统的navagetianbarItem模型和tabbarItem模型都是父控件的bar设置的时候取出子控件Item属性模型,来设置..

//因事件发生而需要改变,别的类,或控件属性时,用代理,或者通知

31.// 插件路径:前往 -> 资源库 -> Application Support -> Developer

32.// 获取当前整个应用程序下的所有导航条的外观
// UINavigationBar *navBar = [UINavigationBar appearance];
// 只影响当前类下面的导航条
// 获取当前类下面的导航条
UINavigationBar *navBar = [UINavigationBar appearanceWhenContainedIn:self, nil];

33.#warning viewDidLoad的时候tableBar的子控件还没加载

34.UITableView的IndexPath对象
@interface NSIndexPath (UITableView)

  • (NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section;

@property (nonatomic, readonly) NSInteger section;
@property (nonatomic, readonly) NSInteger row;

@end

35.// 导航控制器显示一个控制器完成的时候就会调用

  • (void)navigationController:(nonnull UINavigationController *)navigationController didShowViewController:(nonnull UIViewController *)viewController animated:(BOOL)animated
    {
    if (viewController == self.childViewControllers[0]) {
    // 回到根控制器
    self.interactivePopGestureRecognizer.delegate = _popDelegate;
    }else{ // 不是根控制器
    self.interactivePopGestureRecognizer.delegate = nil;

    }
    }

36.typeof(什么都可)//返回传入东东的类型
int a;==typeof(a) a;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容

  • p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo...
    沁晓Chr阅读 724评论 0 0
  • 1. 需要实现的功能 照片小图排列显示,点击任意一张图片可以切换成大图。实现思路:根视图中显示小图,用滚动视图控制...
    yz_wang阅读 457评论 0 1
  • p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo...
    沁晓Chr阅读 305评论 0 0
  • p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo...
    灰客阅读 418评论 0 0
  • 1.ReactiveCocoa简介 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于i...
    叶君臣阅读 1,598评论 0 1