iOS開(kāi)發(fā)總結(jié)(一)

instancetype和id

  • instancetype比id多一個(gè)好處:編譯器會(huì)檢測(cè)instancetype的真實(shí)類型,會(huì)提示警告装诡,防止程序奔潰。

給Xcode中給所有新創(chuàng)建的加上類前綴,在Class Prefix中加入類前綴

屏幕快照 2016-03-07 上午9.52.12.png

一個(gè)控件看不見(jiàn)的可能

  • 寬度或者個(gè)高度為0
  • 位置不對(duì)(超出屏幕)
  • hidden == YES;(隱藏起來(lái))
  • alpha <= 0.01;(透明度)
  • 沒(méi)有設(shè)置背景顏色
  • 關(guān)于-(void)layoutSubviews
/**
 這個(gè)方法專門用來(lái)布局子控件,一般在這里設(shè)置子空間的frame
 當(dāng)控件本身的尺寸發(fā)生改變的時(shí)候遣钳,系統(tǒng)會(huì)自動(dòng)調(diào)用這個(gè)方法
 */
-(void)layoutSubviews
{
    [super layoutSubviews];
    CGFloat shopW = self.frame.size.width;
    CGFloat shopH = self.frame.size.height;
    self.iconView.frame = CGRectMake(0, 0, shopW, shopW);
    self.nameLabel.frame = CGRectMake(0, shopW, shopW, shopH);
}

view的封裝

  • 將view內(nèi)部的子控件自定義,不要讓控制器知道
  • 將模型數(shù)據(jù)給view饮亏,view拿到模型數(shù)據(jù)后給內(nèi)部子空間設(shè)置對(duì)應(yīng)的數(shù)據(jù)

如果想讓UIScrollView靜止某個(gè)方向滾動(dòng)

self.scrollView.contentSize = CGSizeMake(0, 250);
scrollEnabled = NO;
//沒(méi)有接受到觸摸事件
uesrInteractionEnabled = NO;


UIScrollView中的幾個(gè)屬性

  • 偏移量 耍贾,相對(duì)于UIScrollView原點(diǎn)的偏移量,有正值也有負(fù)值路幸。
//contentOffset屬性是偏移量荐开,記錄UIScrollView滾動(dòng)的位置(是一個(gè)點(diǎn))
self.scrollView.contentOffset.x;
self.scrollView.contentOffset.y;
NSLog(@"------%@",NSStringFromCGPoint(self.scrollView.contentOffset));
//contentSize屬性ScrollView內(nèi)容的尺寸
//contentInset屬性,是一個(gè)結(jié)構(gòu)體简肴,在scrollVIew四周增加額外的區(qū)域晃听,方便用戶點(diǎn)擊額外區(qū)域的內(nèi)容
self.scrollView.contentInset = UIEdgInsetMake(64,0,0,0);

![Upload UIScrollView常用屬性.png failed. Please try again.]##instancetype和id

  • instancetype比id多一個(gè)好處:編譯器會(huì)檢測(cè)instancetype的真實(shí)類型,會(huì)提示警告砰识,防止程序奔潰能扒。

給Xcode中給所有新創(chuàng)建的加上類前綴,在Class Prefix中加入類前綴

屏幕快照 2016-03-07 上午9.52.12.png

一個(gè)控件看不見(jiàn)的可能

  • 寬度或者個(gè)高度為0
  • 位置不對(duì)(超出屏幕)
  • hidden == YES;(隱藏起來(lái))
  • alpha <= 0.01;(透明度)
  • 沒(méi)有設(shè)置背景顏色
  • 關(guān)于-(void)layoutSubviews
/**
 這個(gè)方法專門用來(lái)布局子控件辫狼,一般在這里設(shè)置子空間的frame
 當(dāng)控件本身的尺寸發(fā)生改變的時(shí)候,系統(tǒng)會(huì)自動(dòng)調(diào)用這個(gè)方法
 */
-(void)layoutSubviews
{
    [super layoutSubviews];
    CGFloat shopW = self.frame.size.width;
    CGFloat shopH = self.frame.size.height;
    self.iconView.frame = CGRectMake(0, 0, shopW, shopW);
    self.nameLabel.frame = CGRectMake(0, shopW, shopW, shopH);
}

view的封裝

  • 將view內(nèi)部的子控件自定義,不要讓控制器知道
  • 將模型數(shù)據(jù)給view濒生,view拿到模型數(shù)據(jù)后給內(nèi)部子空間設(shè)置對(duì)應(yīng)的數(shù)據(jù)

如果想讓UIScrollView靜止某個(gè)方向滾動(dòng)

self.scrollView.contentSize = CGSizeMake(0, 250);
scrollEnabled = NO;
//沒(méi)有接受到觸摸事件
uesrInteractionEnabled = NO;


UIScrollView中的幾個(gè)屬性

  • 偏移量 佩耳,相對(duì)于UIScrollView原點(diǎn)的偏移量,有正值也有負(fù)值真椿。
//contentOffset屬性是偏移量鹃答,記錄UIScrollView滾動(dòng)的位置(是一個(gè)點(diǎn))
self.scrollView.contentOffset.x;
self.scrollView.contentOffset.y;
NSLog(@"------%@",NSStringFromCGPoint(self.scrollView.contentOffset));
//contentSize屬性ScrollView內(nèi)容的尺寸
//contentInset屬性,是一個(gè)結(jié)構(gòu)體突硝,在scrollVIew四周增加額外的區(qū)域测摔,方便用戶點(diǎn)擊額外區(qū)域的內(nèi)容
self.scrollView.contentInset = UIEdgInsetMake(64,0,0,0);
contentInset屬性增加額外區(qū)域.png

屏幕快照 2016-03-07 下午3.52.14.png

簡(jiǎn)單小動(dòng)畫(huà)添加

//方法一
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:2.0f];
    
    CGFloat offsetX = self.scrollView.contentSize.width - self.scrollView.frame.size.width;
    self.scrollView.contentOffset = CGPointMake(offsetX, self.scrollView.contentOffset.y);

    [UIView commitAnimations];

//方法二:
    [UIView animateWithDuration:2.0 animations:^{
         self.scrollView.contentOffset = CGPointMake(0, self.scrollView.contentOffset.y);
    }];
//方法三:
    [UIView animateWithDuration:2.0 animations:^{
        //
    } completion:^(BOOL finished) {
        //
    }];


iOS 開(kāi)發(fā)錯(cuò)誤:Request failed: unacceptable content-type: text/html

  • 這個(gè)錯(cuò)誤是因?yàn)锳FNetworking文件AFURLResponseSerialization.m文件中少了一個(gè) @"text/html",需要在這個(gè)文件中加入解恰。
self.acceptableContentTypes = [NSSet setWithObjects:@"text/html",......];          

contentOffset的可以監(jiān)聽(tīng)用戶上下滑動(dòng)tableview時(shí)候頂部的導(dǎo)航欄出現(xiàn)或者消失


簡(jiǎn)單小動(dòng)畫(huà)添加

//方法一
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:2.0f];
    
    CGFloat offsetX = self.scrollView.contentSize.width - self.scrollView.frame.size.width;
    self.scrollView.contentOffset = CGPointMake(offsetX, self.scrollView.contentOffset.y);

    [UIView commitAnimations];

//方法二:
    [UIView animateWithDuration:2.0 animations:^{
         self.scrollView.contentOffset = CGPointMake(0, self.scrollView.contentOffset.y);
    }];
//方法三:
    [UIView animateWithDuration:2.0 animations:^{
        //
    } completion:^(BOOL finished) {
        //
    }];


iOS 開(kāi)發(fā)錯(cuò)誤:Request failed: unacceptable content-type: text/html

  • 這個(gè)錯(cuò)誤是因?yàn)锳FNetworking文件AFURLResponseSerialization.m文件中少了一個(gè) @"text/html"锋八,需要在這個(gè)文件中加入。
self.acceptableContentTypes = [NSSet setWithObjects:@"text/html",......];          

UIScrollview計(jì)算滾動(dòng)到最底部控件的高度修噪,答題卡(缺陷:由于scrollView中有滾動(dòng)條查库,lastObject可能指代的是滾動(dòng)條)


- (void)viewDidLoad {
    [super viewDidLoad];
    UIScrollView *scrollView = [[UIScrollView alloc]init];
    scrollView.backgroundColor = [UIColor redColor];
    scrollView.frame = CGRectMake(30, 50, 250, 250);
    [self.view addSubview: scrollView];
    
    for (int i = 0; i < 50 ; i++) {
        int row = i / 3;//行號(hào)
        int col = i % 3;//列號(hào)
        CGFloat x = row *(50 + 20);
        CGFloat y = col *(50 + 20);
        [self addGridWithX:x y:y scrollView:scrollView];
        
    }
    //最后一個(gè)控件的高度y值加上它本身的高度就是整個(gè)scrollView的高度
    UIView *lastView =[scrollView.subviews lastObject];
    CGFloat contentH = lastView.frame.origin.y + lastView.frame.size.height;
//或者使用 CGRectGetMaxY(lastView.frame);算最大Y值
    scrollView.contentSize = CGSizeMake(0, contentH);
    
    //水平和豎直方向的滾動(dòng)條消失,可以解決lastObject指代滾動(dòng)條
    scrollView.showsVerticalScrollIndicator = NO;
    scrollView.showsHorizontalScrollIndicator = NO;
}

-(void)addGridWithX:(CGFloat)x y:(CGFloat)y scrollView:(UIScrollView *)scrollView
{
    UIView *view = [[UIView alloc]init];
    view.frame = CGRectMake(x, y, 50, 50);
    view.backgroundColor = [UIColor blueColor];
    [scrollView addSubview:view];
    
}
UIScrollView常用屬性.png

UIScrollview代理

id<UIscrollViewDelegate> *delegate;

//設(shè)置代理
self.scrollView.delegate = self;
#pragma mark - 協(xié)議
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"scrollViewDidScroll");
}

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    NSLog(@"scrollViewWillBeginDragging");
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    NSLog(@"scrollViewDidEndDragging");
}
  • id類型說(shuō)明是任何類型都可以用
  • 代理是用來(lái)監(jiān)聽(tīng)某些行為

UIScrollView內(nèi)容縮放

UIScrollView內(nèi)容縮放.png
  • 通過(guò)代理
@interface ViewController ()<UIScrollViewDelegate>
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
/** 圖片 */
@property (nonatomic, strong) UIImageView * imageView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIImageView *imageView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"minion"]];
    [self.scrollView addSubview:imageView];
    self.imageView = imageView;
    
    self.scrollView.backgroundColor = [UIColor redColor];
    self.scrollView.contentSize = imageView.frame.size;
    
    //設(shè)置代理
    self.scrollView.delegate = self;
    //設(shè)置縮放比例
    self.scrollView.maximumZoomScale = 2.0f;
    self.scrollView.minimumZoomScale = 0.2f;
    
}

#pragma mark - <UIScrollViewDelegate>
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return self.imageView;
}

ARC沒(méi)有被強(qiáng)指針引用就會(huì)被銷毀

為什么控件使用@property(weak,nonatomic)屬性黄琼,不會(huì)被銷毀樊销?

//這行代碼將控件裝在一個(gè)數(shù)組中
[self.view addSubview:button];
//=> self.view.subviews = @[button];按鈕在數(shù)組中裝著所以不會(huì)“死”

Scrollview滾動(dòng)視圖

Scrollview滾動(dòng)視圖.png
    int count = 5;
    CGFloat w = self.scrollView.frame.size.width;
    CGFloat h = self.scrollView.frame.size.height;
    
    for (int i = 0; i < count; i++) {
        UIImageView *imageView = [[UIImageView alloc]init];
        imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"img_0%d",i ]];
        imageView.frame = CGRectMake(i * w, 0, w, h);
        [self.scrollView addSubview:imageView];
    }
    CGFloat contentW = count * w;
    self.scrollView.contentSize = CGSizeMake(contentW, 0);
    self.scrollView.showsHorizontalScrollIndicator = NO;
    //開(kāi)啟分頁(yè)功能
    self.scrollView.pagingEnabled = YES;
  • 缺點(diǎn):圖片過(guò)多,消耗內(nèi)存過(guò)大(建議用三個(gè)ImageView加載圖片)

設(shè)置圖片防止多次調(diào)用set方法導(dǎo)致覆蓋

    // 移除之前的所有imageView
    // 讓subviews數(shù)組中的所有對(duì)象都執(zhí)行removeFromSuperview方法
    [self.scrollView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

封裝框架時(shí)脏款,如果屬性或方法過(guò)期(不建議使用)围苫,提示用戶這個(gè)屬性或者方法過(guò)期

//
@property (nonatomic, strong) UIColor *otherColor NS_DEPRECATED_FRAMEWORK(2_0, 7_0,"建議使用這個(gè)屬性") ; 
提示用戶這個(gè)屬性或者方法過(guò)期.png

消息循環(huán),運(yùn)行循環(huán)(runloop)

  • 一個(gè)循環(huán)結(jié)束時(shí)候撤师,會(huì)把修改內(nèi)容渲染上去

錯(cuò)誤警告

//原因是設(shè)置的圖片是空的
CUICatalog: Invalid asset name supplied: (null)

封裝控件小技巧

//通過(guò)純代碼可以使用- (void)setup
- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        [self setup];
    }
    return self;
}
//通過(guò)xib文件也可以調(diào)用- (void)setup
- (void)awakeFromNib
{
    [self setup];
}

- (void)setup
{
    self.textColor = [UIColor redColor];
    self.textAlignment = NSTextAlignmentCenter;
}

- (void)drawRect:(CGRect)rect
{
    [super drawRect:rect];
    
    [self.textColor set];
    CGFloat w = rect.size.width;
    CGFloat h = rect.size.height;
    UIRectFill(CGRectMake(0, h * 0.3, w, 1));
}

滾動(dòng)分頁(yè)自動(dòng)跳轉(zhuǎn)實(shí)現(xiàn): 頁(yè)碼 * 寬度 = 偏移量

//頁(yè)碼 * 寬度 = 偏移量
-(void)nextPage
{
    NSInteger page = self.pageControl.currentPage + 1;
    if(page == self.pageControl.numberOfPages){
        page = 0;
    }
    CGPoint offset = self.scrollView.contentOffset;
    offset.x = page * self.scrollView.frame.size.width;
    [self.scrollView setContentOffset:offset animated:YES];   
}

在xib中讓文字在label中換行剂府,用option鍵 + 回車

label換行.png

百思不得姐項(xiàng)目中

  • 1、重復(fù)發(fā)請(qǐng)求問(wèn)題解決方案
    懶加載
  • 2剃盾、加載圖片越來(lái)越多
    SDWebImage腺占,有個(gè)一warning淤袜,會(huì)監(jiān)聽(tīng)系統(tǒng)發(fā)生內(nèi)存警告,對(duì)調(diào)用清理內(nèi)存衰伯,clearMemory方法铡羡。
  • 3、解決多次點(diǎn)擊意鲸,多次發(fā)送請(qǐng)求問(wèn)題
    將請(qǐng)求參數(shù)保存起來(lái)烦周,判斷是不是同一個(gè)參數(shù),如果是同一個(gè)請(qǐng)求怎顾,則不發(fā)送請(qǐng)求读慎。

if(self.params != params) return;

  • 4、銷毀控制器
    如果控制器死了槐雾,調(diào)用這個(gè)函數(shù)
-(void)dealloc
 {
      [self.manager.operationQueue cancelAllOperations];
}

如何監(jiān)聽(tīng)UITextField中輸入的內(nèi)容

繼承自UIControl的類都可以用夭委,addTarget:action:forControlEvents屬性來(lái)做監(jiān)聽(tīng)對(duì)象添加的事件,監(jiān)聽(tīng)用戶在鍵盤(pán)中輸入了什么內(nèi)容募强。

設(shè)置Tabbar選中后的圖片為原始圖闰靴,而不是系統(tǒng)自帶的藍(lán)色圖片

在圖片設(shè)置中設(shè)置成原始圖片
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市钻注,隨后出現(xiàn)的幾起案子蚂且,更是在濱河造成了極大的恐慌,老刑警劉巖幅恋,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杏死,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捆交,警方通過(guò)查閱死者的電腦和手機(jī)淑翼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)品追,“玉大人玄括,你說(shuō)我怎么就攤上這事∪馔撸” “怎么了遭京?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)泞莉。 經(jīng)常有香客問(wèn)我哪雕,道長(zhǎng),這世上最難降的妖魔是什么鲫趁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任斯嚎,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘堡僻。我一直安慰自己糠惫,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布钉疫。 她就那樣靜靜地躺著寞钥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪陌选。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天蹄溉,我揣著相機(jī)與錄音咨油,去河邊找鬼。 笑死柒爵,一個(gè)胖子當(dāng)著我的面吹牛役电,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播棉胀,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼法瑟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了唁奢?” 一聲冷哼從身側(cè)響起霎挟,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎麻掸,沒(méi)想到半個(gè)月后酥夭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脊奋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年熬北,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诚隙。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讶隐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出久又,到底是詐尸還是另有隱情巫延,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布地消,位于F島的核電站烈评,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏犯建。R本人自食惡果不足惜讲冠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望适瓦。 院中可真熱鬧竿开,春花似錦谱仪、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至列荔,卻和暖如春敬尺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贴浙。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工砂吞, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崎溃。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓蜻直,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親袁串。 傳聞我的和親對(duì)象是個(gè)殘疾皇子概而,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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