根據上圖,由於我是一個Java程序員,前面兩個階段還是學的比較快的,但是由於電腦配置不行,光是開啟虛擬機登陸OS系統就卡的不要不要的了,在那里面寫代碼簡直是煎熬= =,后面的UI學習又要啟動ios模擬器,根本無法進行。
於是下定決心,入手一台Macbook pro,告別我用了四年的聯想~今天本本到貨啦,哈哈^_^,可以愉快的繼續了
2015/10/14
Day 15
為了便於開發者打造各式各樣的優秀app,UIKit框架提供了非常多功能強大又易用的UI控件
2015/10/16
Day 16
第一個IOS程序
利用storyboard,拖控件上去,設置屬性和監聽方法,運行模擬器
UIButton,UILabel,UITextField,UIImageView等常用控件的熟悉,它們都是UIView的子類
UIButton是個比較強大且常用的控件,它可以顯示兩張圖片,顯示文字,還有各種事件的監聽
連線設置屬性或者監聽方法
添加動畫效果
多個控件可以連線到一個監聽方法中,利用tag區分控件,不過一般不建議這么做
注意點:
1.IBAction:
1> 能保證方法可以連線
2> 相當於void
2.IBOutlet:
1> 能保證屬性可以連線
3.常見錯誤
setValue:forUndefinedKey:]: this class is not key value coding
錯誤原因是:連線出問題了
4.Xcode5開始的一些建議
把用於連線的一些方法和屬性聲明在.m文件的類擴展中
5.frame\center\bounds
1> frame:能修改位置和尺寸
2> center:能修改位置
3> bounds:能修改尺寸(x\y一般都是0)
2015/10/17
Day 17
transform的使用
它可以平移/縮放/旋轉
CGAffineTransformScale : 縮放
CGAffineTransformRotate : 旋轉
CGAffineTransformTranslate : 平移
小結:
- 上面的平移,如果該控件之前旋轉過,平移的方向也會跟着變化
- plist文件的使用,類似於Java中的property文件
- 方法的封裝
2015/10/18
Day 18
序列幀動畫的播放
其實是利用圖片數組,遍歷顯示
設置好圖片,動畫播放時間以及重復次數,就可以播放,動畫放完清除內存
遇到的問題:代碼正確,動畫未能播放
原因:如果資源文件是拖進去的,可能沒有真正加入Bundle中
解決方法:在設置的build phase下的copy bundle resources下面的+號里添加自己的數據
@property參數的使用
copy:NSString
strong:一般對象
weak:UI控件
assign:基本數據類型
2015/10/19
Day 19
利用代碼創建控件
用for循環創建N宮格
頁面是利用像素坐標,左上為原點
作為一名Java程序員,對於前端網頁是非常頭疼的,而且各種瀏覽器的兼容也是一大問題,但是IOS中完全不是問題啊~真是太輕松了
字典轉模型(Model)
字典:通過key取值,容易寫錯,而且寫錯了編譯器不會報錯的
模型:所謂模型,其實就是數據模型,專門用來存放數據的對象,用它來表示數據會更加專業
模型設置數據和取出數據都是通過它的屬性,屬性名如果寫錯了,編譯器會馬上報錯,因此,保證了數據的正確性
使用模型訪問屬性時,編譯器會提供一系列的提示,提高編碼效率
注意點:
- 模型中提供兩個構造方法,一個對象方法,一個類方法,返回值類型用instancetype,不要用id,因為這樣類型不匹配編譯器不會報錯的
- 可以利用KVC簡化代碼,如下
- (instancetype)initWithDic:(NSDictionary *)dic {
if (self = [super init]) {
// self.icon = dic[@"icon"];
// self.title = dic[@"title"];
// self.price = dic[@"price"];
// self.buyCount = dic[@"buyCount"];
[self setValuesForKeysWithDictionary:dic];//由於字典里的key與模型的屬性名一致,kvc一句搞定
}
return self;
}
+ (instancetype)tgWithDic:(NSDictionary *)dic {
return [[self alloc] initWithDic:dic];
}
xib:可以描述軟件界面,輕量級,一般用來描述局部界面
- Xib文件的加載
- 方法1
NSArray *objs = [[NSBundle mainBundle] loadNibNamed:@"MJAppView" owner:nil options:nil];
這個方法會創建xib中的所有對象,並且將對象按順序放到objs數組中
(如果xib如右圖所示,那么objs數組中依次會有3個對象:1個UIView、1個UIButton、1個UISwitch)
- 方法2
bundle參數可以為nil,默認就是main bundle
UINib *nib = [UINib nibWithNibName:@"MJAppView" bundle:[NSBundle mainBundle]];
NSArray *objs = [nib instantiateWithOwner:nil options:nil];
在開發階段,面向開發者的是xib文件; 當把應用裝到手機上時,xib文件就會轉為nib文件
storyboard:描述軟件界面,重量級,一般用來描述軟件的所有界面,並且能展示多個界面之間的跳轉關系
view的封裝
如果一個view內部的子控件比較多,一般會考慮自定義一個view,把它內部子控件的創建屏蔽起來,不讓外界關心
外界可以傳入對應的模型數據給view,view拿到模型數據后給內部的子控件設置對應的數據
使用xib封裝一個自定義view的步驟
1> 新建一個繼承UIView的自定義view,假設類名叫做(AppView)
2> 新建一個AppView.xib文件來描述AppView內部的結構
3> 修改UIView的類型為AppView真是類型
4> 將內部的子控件跟AppView進行屬性連線
5> AppView提供一個模型屬性
6> 重寫模型屬性的set方法,因為在set方法中可以拿到外界傳遞的模型數據
7> 把模型數據拆開,分別設置數據到對應的子控件中
8> 補充:提供一個創建AppView的類方法,將讀取xib文件的代碼屏蔽起來
某個控件不出來時
1.frame的尺寸和位置對不對
2.hidden是否為YES
3.有沒有添加到父控件
4.alpha是否 < 0.01
5.被其他控件擋住了
6.父控件的前面五個情況
2015/10/20
Day 20
開始做一個綜合的小案例
按鈕的多功能使用
@2x的含義,用於Retina屏幕,所謂Retain屏幕,就是高清視網膜屏幕,分辨率寬高是標准屏幕分辨率的2倍
應用程序圖標、啟動圖片的添加
狀態欄默認情況下歸控制器管理,比如狀態欄的樣式、狀態欄的是否可見
控制器通過重寫以下方法來控制狀態欄
設置狀態欄的樣式
(UIStatusBarStyle)preferredStatusBarStyle;
其中UIStatusBarStyleLightContent是白色樣式
設置狀態欄的可見性
- (BOOL)prefersStatusBarHidden;
UIButton有很多種狀態,它提供了一些便捷屬性,可以直接獲取當前狀態下的文字、文字顏色、圖片等
@property(nonatomic,readonly,retain) NSString *currentTitle;
@property(nonatomic,readonly,retain) UIColor *currentTitleColor;
@property(nonatomic,readonly,retain) UIImage *currentImage;
@property(nonatomic,readonly,retain) UIImage *currentBackgroundImage;
2015/10/21
Day 21
1.添加圖片資源
2.搭建UI界面
* 文本標簽
* 4個按鈕
* 中間的圖片
3.設置狀態欄樣式
4.監聽下一題按鈕的點擊
5.延遲加載數據
* 加載plist
* 字典轉模型
* KVC的引入
6.切換下一題的序號、圖片、標題,下一題按鈕的可用性
7.默認顯示第1條題目
8.顯示大圖
* 監聽中間圖片點擊
* 添加遮蓋
* 移動圖片(注意頭像圖片的層級順序)
* 監聽“大圖按鈕”
9.展示答案的個數
10.展示待選答案
11.答案處理
12.提示功能
剛開始感覺無從下手,但是按照這個步驟一步步來,還是能搞定的
2015/10/22
Day 22
UIScrollView
什么是UIScrollView?
移動設備的屏幕大小是極其有限的,因此直接展示在用戶眼前的內容也相當有限
當展示的內容較多,超出一個屏幕時,用戶可通過滾動手勢來查看屏幕以外的內容
普通的UIView不具備滾動功能,不能顯示過多的內容
UIScrollView是一個能夠滾動的視圖控件,可以用來展示大量的內容,並且可以通過滾動查看所有的內容
UIScrollView的用法
將需要展示的內容添加到UIScrollView中
設置UIScrollView的contentSize屬性,告訴UIScrollView所有內容的尺寸,也就是告訴它滾動的范圍(能滾多遠,滾到哪里是盡頭)
如果UIScrollView無法滾動,可能是以下原因:
- 沒有設置contentSize
- scrollEnabled = NO
- 沒有接收到觸摸事件:userInteractionEnabled = NO
- 沒有取消autolayout功能(要想scrollView滾動,必須取消autolayout)
UIScrollView的代理(delegate)
很多時候,我們想在UIScrollView正在滾動 或 滾動到某個位置 或者 停止滾動 時做一些特定的操作
要想完成上述功能,前提條件就是能夠監聽到UIScrollView的整個滾動過程
當UIScrollView發生一系列的滾動操作時, 會自動通知它的代理(delegate)對象,給它的代理發送相應的消息,讓代理得知它的滾動情況
也就是說,要想監聽UIScrollView的滾動過程,就必須先給UIScrollView設置一個代理對象,然后通過代理得知UIScrollView的滾動過程
可以看出,要想成為UIScrollView的delegate,是有條件的,必須實現對應的方法才能監聽UIScrollView的滾動過程
UIScrollView將delegate需要實現的方法都定義在了UIScrollViewDelegate協議中,因此要想成為UIScrollView的delegate,必須遵守UIScrollViewDelegate協議,然后實現協議中相應的方法,就可以監聽UIScrollView的滾動過程了
一般情況下,就設置UIScrollView所在的控制器 為 UIScrollView的delegate
設置控制器為UIScrollView的delegate有2種方法:
- 通過代碼(self就是控制器)
self.scrollView.delegate = self;
- 通過storyboard拖線(右擊UIScrollView)
然后,控制器應該遵守UIScrollViewDelegate協議
最后,實現協議中定義的相關方法
UIScrollView的常見屬性
- @property(nonatomic) CGPoint contentOffset; 這個屬性用來表示UIScrollView滾動的位置
- @property(nonatomic) CGSize contentSize; 這個屬性用來表示UIScrollView內容的尺寸,滾動范圍(能滾多遠)
- @property(nonatomic) UIEdgeInsets contentInset; 這個屬性能夠在UIScrollView的4周增加額外的滾動區域
其他屬性
- @property(nonatomic) BOOL bounces;設置UIScrollView是否需要彈簧效果
- @property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled; 設置UIScrollView是否能滾動
- @property(nonatomic) BOOL showsHorizontalScrollIndicator;是否顯示水平滾動條
- @property(nonatomic) BOOL showsVerticalScrollIndicator;是否顯示垂直滾動條
UIScrollView不僅能滾動顯示大量內容,還能對其內容進行縮放處理
當用戶在UIScrollView身上使用捏合手勢時,UIScrollView會調用代理的viewForZoomingInScrollView:方法,這個方法返回的控件就是需要進行縮放的控件
實現縮放的步驟
- 設置UIScrollView的id<UISCrollViewDelegate> delegate代理對象
- 設置minimumZoomScale :縮小的最小比例
- 設置maximumZoomScale :放大的最大比例
- 讓代理對象實現下面的方法,返回需要縮放的視圖控件
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;
跟縮放相關的其他代理方法
- 縮放完畢的時候調用 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
- 正在縮放的時候調用- (void)scrollViewDidZoom:(UIScrollView *)scrollView
分頁
只要將UIScrollView的pageEnabled屬性設置為YES,UIScrollView會被分割成多個獨立頁面,里面的內容就能進行分頁展示
一般會配合UIPageControl增強分頁效果,UIPageControl常用屬性如下
一共有多少頁
@property(nonatomic) NSInteger numberOfPages;
當前顯示的頁碼
@property(nonatomic) NSInteger currentPage;
只有一頁時,是否需要隱藏頁碼指示器
@property(nonatomic) BOOL hidesForSinglePage;
其他頁碼指示器的顏色
@property(nonatomic,retain) UIColor *pageIndicatorTintColor;
當前頁碼指示器的顏色
@property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;
NSTimer
NSTimer叫做“定時器”,它的作用如下
在指定的時間執行指定的任務
每隔一段時間執行指定的任務
調用下面的方法就會開啟一個定時任務
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)time target:(id)aTarget
selector:(SEL)aSelector
userInfo:(id)userInfo
repeats:(BOOL)yesOrNo;
每隔time秒,調用一次aTarget的aSelector方法,yesOrNo決定了是否重復執行這個任務
通過invalidate方法可以停止定時器的工作,一旦定時器被停止了,就不能再次執行任務。只能再創建一個新的定時器才能執行新的任務
- (void)invalidate;
利用它可以做UIScrollView的自動翻頁,就像常見的廣告頁面