Apple Watch學習之路--基礎控件學習

工欲善其事必先利其器某宪,watch中基本控件的學習是寫watch app的基石

WatchKit中的控件都繼承自WKInterfaceObject淀散,都以WKInterface開頭该镣。下面是apple watch 常用的控件:
source demo 傳送門:https://github.com/wongstar/AppleWatchDemo

WKInterfaceGroup--->Group watch常用的控件廓译,主要有水平和垂直兩個方向
WKInterfaceImage--->圖片
WKInterfaceMovie--->播放視頻相關
WKInterfaceLabel--->label 標簽
WKInterfacePicker --->時間選擇器
WKInterfaceTable--->table ui相關非常重要
WKInterfaceTimer--->timer時間
WKInterfaceSwitch--->switch選擇器
WKInterfaceSlider  --->slider一般用在音量大小
WKInterfaceButton  --->按鈕ui
WKInterfaceMap --->map地圖相關

WKInterfaceGroup使用

WKInterfaceGroup.png

如上圖所示:

  • 從控件版面中拉2個Group控件到UI中,把它們重命名為Group1,Group2乙濒,然后分別拉2個button到Group1 Group2中
  • 點擊Group1 設置Layout方向為Vertical ,里面的item直接的間距設置Spacing =11.加入button 1 和button 2加入Group容器中陕赃。
  • 點擊Group2 設置Layout方向horizontal ,里面的item會水平排列。設置item直接的間距11 就直接調整Spacing
  • 設置Group中item的寬高颁股,所以設置Width和Height為Fixed模式么库,然后填寫對應的寬高值。

WKInterfaceTable使用

首先查看下WatchOS 中WKInterfaceTable提供了哪些方法和屬性

open class WKInterfaceTable : WKInterfaceObject {
   open func setRowTypes(_ rowTypes: [String]) // row names. size of array is number of rows
    open func setNumberOfRows(_ numberOfRows: Int, withRowType rowType: String) // repeating row name----->必須要實現(xiàn)才能知道又多少rows
    open var numberOfRows: Int { get }---->獲取有多少rows
    open func rowController(at index: Int) -> Any? ---->必須實現(xiàn)遍歷每個row
    open func insertRows(at rows: IndexSet, withRowType rowType: String)--->insert rows 到tableview中去
    open func removeRows(at rows: IndexSet) ----->移除指定的row
    open func scrollToRow(at index: Int) ------>滑動到指定的row
    @available(watchOS 3.0, *)
    open func performSegue(forRow row: Int)  ---->watch os 3.0點擊之后跳轉
}

從storyboard UI控件區(qū)拉一個table到Interface中 如下圖所示


WKInterfaceTable.png

然后storyboard UI中table拉一個鏈接到TableController中甘有,然后產生一個table參數(shù)

 @IBOutlet var table: WKInterfaceTable!

接下來新建一個Cell.swfit 文件


tableCell.png

如上圖所示:

  • 新建一個名為TestTableCell.swfit文件.把tableview中的cell對應的Custom class指向該文件
  • 加入WKInterfaceLabel 和WKInterfaceImage 2個對象到UI中诉儒,并且把這兩個鏈接指向TestTableCell中的兩個控件變量

TestTableCell.swfit 源碼如下:

class TestTableCell: NSObject {
    @IBOutlet var leftTitle: WKInterfaceLabel!
    @IBOutlet var icon: WKInterfaceImage!
    var source:String?{
        didSet{
            leftTitle.setText(source);
            icon.setImage(UIImage.init(named: "like.png"))
        }
    }
}

如上源碼所示設置了一個變量source,在tableviewcell中設置值更新對應的label和image

對應的ui 的controller 名稱為:TestTableInterfaceController具體source如下:

     table.setNumberOfRows(sources.count, withRowType: "cellId")
        for index in 0..<table.numberOfRows{
            if let cell = table.rowController(at: index) as? TestTableCell {
                cell.source=sources[index]//call cell source 更新UI
            }
        }

setNumberOfRows (sources.count, withRowType:"cellId")->設置有多少row 注意這里cellId要在storyboard 要設置在Row Controller屬性中Identifier設置為cellId
for index in 0..<table.numberOfRows -->遍歷sources中每個item
table.rowController(at: index) 設置cell相關參數(shù) index:為當前是第幾個row
cell.source=sources[index]//call cell source 更新UI

那tableview item點擊在watch os怎么處理呢亏掀?

  • 第一種方式:通過storyBoard中拉線跳轉允睹,通過segue push方式跳轉到其他的Interface,傳值的時候需要在InterfaceController實現(xiàn)下面方法
override func contextForSegue(withIdentifier segueIdentifier: String) -> Any?
  • 第二種方式:我們可以重寫實現(xiàn)InterfaceController中的如下方法,來處理Table的點擊事件
override func table(_ table: WKInterfaceTable, didSelectRowAt rowIndex: Int)

Audio Video 使用

  • 調用系統(tǒng)播放控件
    通過self.presentMediaPlayerControllerWithURL方法來調用系統(tǒng)控件來實現(xiàn)播放幌氮。如下面代碼:
let myBundle = NSBundle.mainBundle()
if let movieURL = myBundle.URLForResource("myMovie", withExtension: "mp4") {
    self.movie.setMovieURL(movieURL)
    
    self.presentMediaPlayerControllerWithURL(movieURL,
                                             options: [WKMediaPlayerControllerOptionsAutoplayKey: true],
                                             completion: { (didPlayToEnd : Bool,
                                                endTime : NSTimeInterval,
                                                error : NSError?) -> Void in
                                                if let anErrorOccurred = error {
                                                    // Handle the error.
                                                }
                                                // Perform other tasks
    })
    
}

畫面UI見下圖:


movie界面.png
  • 通過WKInterfaceMovie控件
    WKInterfaceMovie 對象是播放video 和audio控件,:
open class WKInterfaceMovie : WKInterfaceObject {
    open func setMovieURL(_ URL: URL)//把Video or Audio url的放入其中
    open func setVideoGravity(_ videoGravity: WKVideoGravity) // default is WKVideoGravityResizeAspec
//AVLayerVideoGravityResizeAspectFill: 這可以保留縱橫比缭受,但填滿可用的屏幕區(qū)域,裁剪視頻必要時
    open func setLoops(_ loops: Bool)//是否循環(huán)播放
    open func setPosterImage(_ posterImage: WKImage?)//設置封面
}

Gravity的可以如下:
public enum WKVideoGravity : Int {
    case resizeAspect //
    case resizeAspectFill //全部平鋪
    case resize //實際size
}

從storyBoard拉根線到TestMapInterfaceController.swift

@IBOutlet var myMovie: WKInterfaceMovie!
let moviePath=Bundle.main.path(forResource: "minion", ofType: "mp4")
if moviePath == nil{
            return ;
        }
let url = URL(fileURLWithPath:moviePath!)
if url == nil{
            return;
        }
self.myMovie.setMovieURL(url)//設置url
self.myMovie.setLoops(true)//設置循環(huán)播放
self.myMovie.setPosterImage(WKImage.init(imageName: "like.png"))//設置開始的封面
self.myMovie.setVideoGravity(WKVideoGravity.resizeAspect)//設置video播放的大小

得出下面的UI

視頻.gif
  • Play Local Audio file
    通過WKAudioFilePlayer播放本地的mp3文件,通過WKAudioFileQueuePlayer 可以循環(huán)播放列表
audio_file.png
想隨時了解我的動態(tài)该互,請關注我的個人公眾號
蟻農之家.jpg
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末米者,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子宇智,更是在濱河造成了極大的恐慌蔓搞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件随橘,死亡現(xiàn)場離奇詭異喂分,居然都是意外死亡,警方通過查閱死者的電腦和手機机蔗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門糯彬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來纵竖,“玉大人慨蛙,你說我怎么就攤上這事⊙锞恚” “怎么了?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵酸钦,是天一觀的道長怪得。 經常有香客問我,道長卑硫,這世上最難降的妖魔是什么徒恋? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮欢伏,結果婚禮上因谎,老公的妹妹穿的比我還像新娘。我一直安慰自己颜懊,他們只是感情好财岔,可當我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著河爹,像睡著了一般匠璧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咸这,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天夷恍,我揣著相機與錄音,去河邊找鬼媳维。 笑死酿雪,一個胖子當著我的面吹牛,可吹牛的內容都是我干的侄刽。 我是一名探鬼主播指黎,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼州丹!你這毒婦竟也來了醋安?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤墓毒,失蹤者是張志新(化名)和其女友劉穎吓揪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體所计,經...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡柠辞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了主胧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叭首。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡习勤,死狀恐怖,靈堂內的尸體忽然破棺而出放棒,到底是詐尸還是另有隱情,我是刑警寧澤己英,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布间螟,位于F島的核電站,受9級特大地震影響损肛,放射性物質發(fā)生泄漏厢破。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一治拿、第九天 我趴在偏房一處隱蔽的房頂上張望摩泪。 院中可真熱鬧,春花似錦劫谅、人聲如沸见坑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荞驴。三九已至,卻和暖如春贯城,著一層夾襖步出監(jiān)牢的瞬間熊楼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工能犯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鲫骗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓踩晶,卻偏偏與公主長得像执泰,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子渡蜻,可洞房花燭夜當晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,133評論 25 707
  • 我決定坦胶,,晴楔,顿苇,辭職了。
    可樂甜不甜閱讀 147評論 0 0
  • 什么是標簽么呢税弃? 我是父母眼中懂事的乖女兒纪岁,實像中的“我”就是如此。也有從別人口中聽說我是一個比較有距離感的人则果,我...
    依融閱讀 265評論 0 0
  • 父親不擅言辭幔翰,這是從什么時候開始覺得的呢漩氨?好像從上中學后就不怎么喜歡和父親聊天了吧。 記得很小的時候總是喜歡黏在父...
    陳九er閱讀 297評論 0 0
  • 絕大多數(shù)人,可能有這樣一個體驗: 當你維持200個人以上的關系做修,你會感覺很吃力的霍狰,時間不夠用的。但事實上我能夠維持...
    丁昆朋閱讀 545評論 2 5