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];
- //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中調用
- 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
- //在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;