一個java程序員自學IOS開發之路(四)


 

根據上圖,由於我是一個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 : 平移

小結:

  1. 上面的平移,如果該控件之前旋轉過,平移的方向也會跟着變化
  2. plist文件的使用,類似於Java中的property文件
  3. 方法的封裝

 

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取值,容易寫錯,而且寫錯了編譯器不會報錯的

模型:所謂模型,其實就是數據模型,專門用來存放數據的對象,用它來表示數據會更加專業

模型設置數據和取出數據都是通過它的屬性,屬性名如果寫錯了,編譯器會馬上報錯,因此,保證了數據的正確性

使用模型訪問屬性時,編譯器會提供一系列的提示,提高編碼效率

 

注意點:

  1. 模型中提供兩個構造方法,一個對象方法,一個類方法,返回值類型用instancetype,不要用id,因為這樣類型不匹配編譯器不會報錯的
  2. 可以利用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無法滾動,可能是以下原因:

  1. 沒有設置contentSize
  2. scrollEnabled = NO
  3. 沒有接收到觸摸事件:userInteractionEnabled = NO
  4. 沒有取消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:方法,這個方法返回的控件就是需要進行縮放的控件

實現縮放的步驟

  1. 設置UIScrollView的id<UISCrollViewDelegate> delegate代理對象
  2. 設置minimumZoomScale :縮小的最小比例
  3. 設置maximumZoomScale :放大的最大比例
  4. 讓代理對象實現下面的方法,返回需要縮放的視圖控件

- (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的自動翻頁,就像常見的廣告頁面


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM