instancetype和id
- instancetype比id多一個(gè)好處:編譯器會(huì)檢測(cè)instancetype的真實(shí)類型,會(huì)提示警告装诡,防止程序奔潰。
給Xcode中給所有新創(chuàng)建的加上類前綴,在Class Prefix中加入類前綴
屏幕快照 2016-03-07 上午9.52.12.png
屏幕快照 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
屏幕快照 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è)置成原始圖片