iOS学习iOS 开发每天分享优质文章iOS Developer

Apple Watch学习之路--基础控件学习

2017-02-10  本文已影响296人  wongstar

工欲善其事必先利其器,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

如上图所示:

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----->必须要实现才能知道又多少rows
    open var numberOfRows: Int { get }---->获取有多少rows
    open func rowController(at index: Int) -> Any? ---->必须实现遍历每个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控件区拉一个table到Interface中 如下图所示


WKInterfaceTable.png

然后storyboard UI中table拉一个链接到TableController中,然后产生一个table参数

 @IBOutlet var table: WKInterfaceTable!

接下来新建一个Cell.swfit 文件


tableCell.png

如上图所示:

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相关参数 index:为当前是第几个row
cell.source=sources[index]//call cell source 更新UI

那tableview item点击在watch os怎么处理呢?

override func contextForSegue(withIdentifier segueIdentifier: String) -> Any?
override func table(_ table: WKInterfaceTable, didSelectRowAt rowIndex: Int)

Audio Video 使用

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
open class WKInterfaceMovie : WKInterfaceObject {
    open func setMovieURL(_ URL: URL)//把Video or Audio url的放入其中
    open func setVideoGravity(_ videoGravity: WKVideoGravity) // default is WKVideoGravityResizeAspec
//AVLayerVideoGravityResizeAspectFill: 这可以保留纵横比,但填满可用的屏幕区域,裁剪视频必要时
    open func setLoops(_ loops: Bool)//是否循环播放
    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)//设置循环播放
self.myMovie.setPosterImage(WKImage.init(imageName: "like.png"))//设置开始的封面
self.myMovie.setVideoGravity(WKVideoGravity.resizeAspect)//设置video播放的大小

得出下面的UI

视频.gif audio_file.png
想随时了解我的动态,请关注我的个人公众号
蚁农之家.jpg
上一篇 下一篇

猜你喜欢

热点阅读