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閱讀 228,546評論 6 533
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,570評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,505評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,017評論 1 313
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,786評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,219評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,287評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,438評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,971評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,796評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,995評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,540評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,230評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,662評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,918評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,697評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,991評論 2 374

推薦閱讀更多精彩內容

  • p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo...
    沁曉Chr閱讀 731評論 0 0
  • 1. 需要實現的功能 照片小圖排列顯示,點擊任意一張圖片可以切換成大圖。實現思路:根視圖中顯示小圖,用滾動視圖控制...
    yz_wang閱讀 468評論 0 1
  • p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo...
    沁曉Chr閱讀 315評論 0 0
  • p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo...
    灰客閱讀 429評論 0 0
  • 1.ReactiveCocoa簡介 ReactiveCocoa(簡稱為RAC),是由Github開源的一個應用于i...
    葉君臣閱讀 1,631評論 0 1