天天看點

瘋狂ios講義瘋狂連載之圖像控件(UIImageView)

   UIImageView代表一個圖檔顯示控件,它直接繼承了UIView基類,沒有繼承UIControl,是以,UIImage隻能作為圖檔的顯示控件,不能接受使用者輸入,也不能與使用者互動,它隻是一個靜态控件。

   當程式需要使用UIImageView來顯示圖檔時,即可直接在Interface Builder中把UIImageView拖入程式界面中,也可在程式中建立UIImageView對象。

   建立UIImageView對象之後,接下來可以通過如下兩個屬性通路或設定該控件顯示的圖檔。

image:通路或設定該控件顯示的圖檔。

highlightedImage:通路或設定該控件處于高亮狀态時顯示的圖檔。

   除此之外,UIImageView還可以使用動畫顯示一組圖檔,使用UIImageView動畫顯示一組圖檔的屬性和方法如下。

animationImages:通路或者設定該UIImageView需要動畫顯示的多張圖檔。該屬性的值是一個NSArray對象。

highlightedAnimationImages:通路或者設定該UIImageView高亮狀态下需要動畫顯示的多張圖檔。該屬性的值是一個NSArray對象。

animationDuration:通路或設定該UIImageView的動畫持續時間。

animationRepeatCount:通路或設定該UIImageView的動畫重複次數。

startAnimating:開始播放動畫。

stopAnimating:停止播放動畫。

isAnimating:該方法判斷該UIImageView是否正在播放動畫。

瘋狂ios講義瘋狂連載之圖像控件(UIImageView)

   如果在Interface Builder的使用者界面設計檔案中選中一個UIImageView,可以看到Xcode顯示如圖10.24所示的屬性檢查器面闆。

   在圖10.24所示的屬性檢查面闆中,UIImageView所支援的三個屬性的意義非常明确,此處不再贅述。實際上,UIView控件所支援的Mode屬性可控制UIImageView所顯示圖檔的縮放模式,Mode屬性是一個清單框,該清單框支援如下清單項。

Scale To Fill:不保持縱橫比縮放圖檔,使圖檔完全适應該UIImageView控件。

Aspect Fit:保持縱橫比縮放圖檔,使圖檔的長邊能完全顯示出來。也就是說,可以完整地将圖檔顯示出來。

Aspect Fill:保持縱橫比縮放圖檔,隻保證圖檔的短邊能完全顯示出來。也就是說,圖檔通常隻在水準或垂直方向是完整的,另一個方向将會發生截取。

Center:不縮放圖檔,隻顯示圖檔的中間區域。

Top:不縮放圖檔,隻顯示圖檔的頂部區域。

Bottom:不縮放圖檔,隻顯示圖檔的底部區域。

Left:不縮放圖檔,隻顯示圖檔的左邊區域。

Right:不縮放圖檔,隻顯示圖檔的右邊區域。

Top Left:不縮放圖檔,隻顯示圖檔的左上邊區域。

Top Right:不縮放圖檔,隻顯示圖檔的右上邊區域。

Bottom Left:不縮放圖檔,隻顯示圖檔的左下邊區域。

Bottom Right:不縮放圖檔,隻顯示圖檔的右下邊區域。

瘋狂ios講義瘋狂連載之圖像控件(UIImageView)

   利用本執行個體的圖檔浏覽器可以依次檢視應用中的每張圖檔,除此之外,還可以改變正在檢視的圖檔的透明度,這可借助UIView的alpha屬性來實作。不僅如此,本圖檔浏覽器還可通過一個小區域來檢視圖檔的原始大小,是以,本例會定義兩個UIImageView:一個用于檢視圖檔整體,一個用于檢視圖檔局部的細節。

   建立一個Single View Application,并向界面中添加三個按鈕、兩個UIImageView,然後将它們擺放整齊,在Interface Builder中設計出的程式界面如圖10.25所示。

為了能在程式中通路兩個UIImageView控件,還需要在Interface Builder中将這兩個UIImageView綁定到控制器類的IBOutlet屬性:iv1和iv2,這樣控制器類即可通過這兩個屬性來通路這兩個UIImageView控件。

   為了讓程式能響應應用界面上的三個按鈕的單擊事件,還需要在Interface Builder中為這三個按鈕的Touch Up Inside事件綁定IBAction事件處理方法,這些按鈕分别綁定到IBAction事件處理方法為:plus:、minus:和next:。

   完成界面設計之後,接下來編寫該應用界面對應的控制器類的實作部分,主要就是為plus:、minus:和next:方法提供實作。

   除此之外,程式還需要為UIImageView的單擊事件提供響應——問題是UIImageView并未繼承UIControl基類,是以,既不能在Interface Builder中為UIImageView的Touch Up Inside事件綁定IBAction事件處理方法,也不能通過代碼為該控件的Touch Up Inside事件綁定事件處理方法。為了讓UIImageView能響應單擊事件,程式可以通過UIImageView添加手勢檢測器來處理單擊事件。

下面是控制器類的實作部分代碼。

程式清單:codes/10/10.7/UIImageViewTest/UIImageViewTest/FKViewController.m

<a href="http://s3.51cto.com/wyfs02/M02/11/CD/wKioL1LfJNSzzNQ7AAP_7hOYQ7s834.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M01/11/CD/wKiom1LfJQ2hN2F3AAKIu06Gcvg287.jpg" target="_blank"></a>

上面程式中,在viewDidLoad方法中初始化了該程式需要顯示的所有圖檔——将這些圖檔的檔案名組成一個NSArray數組。除此之外,該程式還建立一個手勢檢測器,并為iv(第一個UIImageView控件)添加該手勢檢測器,該手勢檢測器就會負責處理該UIImageView控件上的點選事件。

接下來在plus:、minus:中的粗體字代碼通過修改alpha屬性來控制該控件的透明度,而next:方法中粗體字代碼則通過image屬性來控制該UIImageView所顯示的圖檔。

該程式中的一個難點是使用CGImage來處理位圖,雖然iOS提供了UIImage來代表位圖,但實際上UIImage對位圖的處理功能非常有限,如果需要對位圖進行處理,則需要借助CGImage。第11章介紹圖形、圖像處理時會進一步介紹CGImage的功能和用法。

編譯、運作該程式,可以看到如圖10.26所示的效果。

瘋狂ios講義瘋狂連載之圖像控件(UIImageView)

   UIImageView除了可以顯示單張圖檔之外,還能以動畫方式輪換顯示多張圖檔,這種顯示方式非常類似于幻燈片播放方式。

   為了讓UIImageView以動畫方式顯示多張圖檔,隻要為該UIImageView的animationImages屬性賦一個NSArray集合(該集合元素中都是UIImage對象),接下來設定與動畫相關的一些屬性,再調用UIImageView的startAnimating方法開始播放動畫即可。

   下面的執行個體将會使用UIImageView開發一個幻燈片播放器。

   建立一個Single View Application,使用Interface Builder打開應用界面,并将一個UIImageView拖入該應用界面中。為了能在該應用界面對應的控制器類中通路該UIImageView控件,可以在Interface Builder中将該UIImageView綁定到該控制器類的IBOutlet屬性:iv。

   接下來修改該應用界面對應的控制器類的實作部分,修改後的實作部分代碼如下。

程式清單:codes/10/10.7/UIImageViewTest2/UIImageViewTest2/FKViewController.m

<a href="http://s3.51cto.com/wyfs02/M02/11/CD/wKiom1LfJUyCHtkdAAHgh_U8RAU163.jpg" target="_blank"></a>

   上面程式中,粗體字代碼就是設定UIImageView動畫播放圖檔,并設定該控件的動畫持續時間和動畫重複次數,程式最後調用了UIImageView的startAnimating方法開始播放動畫,這樣即可讓UIImageView開始正常播放動畫。

————本文節選自《瘋狂ios講義(上)》

瘋狂ios講義瘋狂連載之圖像控件(UIImageView)

繼續閱讀