iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 8
1
自我挑戰組

Hey! UIKit, 做個朋友吧~系列 第 8

Day 08: 蛤?你說你在哪?我沒看到你啊UIPageControl

  • 分享至 

  • xImage
  •  

原來是個存在感跟我一樣低的邊緣人啊!

不知道大家有沒有印象,在iphone的主頁下有一排圓點點,在切換頁面時點點的顏色會不同,來表示你現在正在顯示哪一頁,而這個功能就是用UIPageControl做的。
通常UIPageControl會搭配UIScrollView,但因為我還沒讀到scrollView,所以就先用UIPageControl來實作個簡單的頁面切換吧!

真的很簡單,簡單到我自己都覺得我在混。
先給大家看一下完成的demo,實在是太可愛了❤️

(圖片來源:google)

首先我們要先初始化一個UIImageView來放活寶們的圖片,並將import進xcode的圖片名稱照對應的頁數放進一個陣列:

let pageImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height))
pageImageView.contentMode = UIView.ContentMode.scaleAspectFit

let imageNameArray = ["finn", "jack", "beemo", "princessBubblegum", "iceKing", "lumpySpacePrincess"]

等等,這章不是講UIPageControl嗎@__@
不過不放imageView的話沒東西切換啊啊大家請睜一隻眼閉一隻眼。

接下來先初始化一個UIPageControl的實體並設定總頁數:

let newPageControl = UIPageControl()
newPageControl.numberOfPages = imageNameArray.count

總頁數我們使用陣列資料的筆數來代替直接寫死6張圖片,來增加程式碼的可修改性。如此一來如果需要新增圖片,只需要在陣列中新增資料,頁數便會同步增加。

完成前置作業後設定初始頁面,並將對應的圖片指定給imageView

newPageControl.currentPage = 2
pageImageView.image = UIImage(named: imageNameArray[newPageControl.currentPage])

就先用可愛的Beemo當作初始頁面吧~不過可以看到,當我們切換PageControl的時候,圖片並沒有跟著切換,因為圖片還是指定為初始頁面的對應圖,我們必須為他指定一個動作:

@objc func changePageImage(_ sender: UIPageControl) {
    switch sender.currentPage {
    case 0...imageNameArray.count-1:
        pageImageView.image = UIImage(named: imageNameArray[newPageControl.currentPage])
    default: break
    }
}

並把他加入UIPageControl裡:

newPageControl.addTarget(self, action: #selector(changePageImage(_:)), for: .valueChanged)

當pageControl的value改變的時候,就會呼叫changePageImage這個function,他裡面有一個判斷式,可以根據當前pageControl的頁數來顯示相對應的圖片。

現在的狀態已經跟我們的成品有87%像了,大家有注意到有哪裡不一樣嗎?

沒錯!就是pageControl的顏色不一樣(自問自答)。
pageControl的顏色是可以指定的,有整體顏色和當前頁面顏色。
以下提供2種顏色的指定方法:

newPageControl.pageIndicatorTintColor = UIColor.white
newPageControl.currentPageIndicatorTintColor = UIColor(red: 61.0/255.0, green: 89.0/255.0, blue: 171.0/255.0, alpha: 1.0)

可以直接使用UIColor內建的顏色,也可以指定顏色的RGB和透明度。
指定完之後,就是我們可愛的成品啦~

那些我沒告訴你的事

我這不是要說了嗎。

還有一些特性在此次範例中沒有使用到,來跟大家介紹一下:

hide for single page

在pageControl只有一頁的前提下,若hideForSinglePage指定為true時會隱藏pageControl(下圖右)。

但我實在搞不懂,只有一頁的話是要用屁用pageControl啊~~
就算會新增頁面也不用藏吧,pageControl的存在感本來就很薄弱了不要再剝奪啊邊緣人臭了嗎QQ

defers and update

這是一個很神奇的功能。

當pageControl的defersCurrentPageDisplay是true的時候,你點擊pageControl還是會觸發他的動作,但current page的圓點不會更新,要一直到你呼叫updateCurrentPageDisplay()的時候原點才會重新更新。

但我實在是搞不懂,為什麼要這樣子做啊?
是為了整人嗎?其實切換了卻要騙你沒切換這樣,apple的工程師真是調皮啊!

那存在感很低的UIPageControl就跟著這個可愛的demo告一段落啦~
下一回是UISegmentedControl。


上一篇
Day 07: 鐵人賽還沒發文啊QQ我先睡一下十分鐘之後叫我起床
下一篇
Day 09: 我94要分段控制!哈囉控制狂UISegmentedControl
系列文
Hey! UIKit, 做個朋友吧~30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言