macOS 開發(fā)-NSImageView

NSImageView是用來顯示圖像數(shù)據(jù)的視圖疹蛉。

概要

圖像視圖可以是靜態(tài)的活箕,也可以是可編輯的。靜態(tài)圖像視圖僅顯示您指定的圖像可款《锬ⅲ可編輯的圖像視圖對象使用戶可以更改顯示的圖像。還可以配置圖像視圖以允許復(fù)制筑舅,粘貼,刪除和拖動(dòng)圖像陨舱。

注意:僅當(dāng)用戶將圖像拖動(dòng)到圖像視圖的邊界中時(shí)魄鸦,圖像視圖才調(diào)用其action方法垢箕,并且該圖像視圖必須可編輯才能接收拖動(dòng)的圖像。如果要顯示圖像并響應(yīng)圖像中的單擊,請改用NSButton對象弥锄。

初始化

NSImageView初始化api:

// 通過指定一個(gè)image創(chuàng)建對象
init(image: NSImage)

指定圖像

// 圖像視圖顯示的圖像
var image: NSImage?

當(dāng)我們需要顯示一張圖片的時(shí)候, 我們可以通過ImageView來處理:

lazy var imageView: NSImageView = {
    let imageView = NSImageView()
    imageView.frame = NSRect(x: 30, y: 30, width: 100, height: 100)
    imageView.image = NSImage(named: "1.jpeg")
    return imageView
}()
override func viewDidLoad() {
    super.viewDidLoad()
    setupSubviews()
}
private func setupSubviews() {
    view.addSubview(imageView)
}

指定視覺特征

// 圖像周圍出現(xiàn)的框架樣式
var imageFrameStyle: NSImageView.FrameStyle
// 圖像視圖中單元格圖像的對齊方式
var imageAlignment: NSImageAlignment
// 縮放模式用于使單元格的圖像適合圖像視圖的框架
var imageScaling: NSImageScaling
// 指示圖像視圖是否自動(dòng)播放動(dòng)畫圖像
var animates: Bool

當(dāng)我們需要顯示gif圖像時(shí)遇伞,animates則需要設(shè)置為true

imageView.animates = true
imageView.image = NSImage(named: "1.gif")

響應(yīng)用戶事件

// 指示用戶是否可以將新圖像拖到圖像視圖中
var isEditable: Bool
// 指示圖像視圖是否允許用戶剪切字旭,復(fù)制和粘貼圖像內(nèi)容
var allowsCutCopyPaste: Bool

需要注意的是, 如果我們設(shè)置allowsCutCopyPastetrue時(shí)莺奔,我們向ImageView粘貼圖片時(shí)欣范,默認(rèn)粘貼過去的是圖片的系統(tǒng)圖標(biāo),并不是真正的圖片。如果需要顯示真正的圖片恼琼,我們需要從粘貼板中獲取已經(jīng)復(fù)制的Image妨蛹,然后再將Image設(shè)置給ImageView

lazy var imageView: NSImageView = {
    let imageView = NSImageView()
    imageView.frame = NSRect(x: 30, y: 30, width: 100, height: 100)
    imageView.action = #selector(pasteImage(_:))
    imageView.allowsCutCopyPaste = true
    return imageView
}()
@objc private func pasteImage(_ tager: NSImageView) {
    let pasteboard = NSPasteboard.general
    if let data = pasteboard.data(forType: NSPasteboard.PasteboardType.fileURL),
        let str =  String(data: data, encoding: .utf8),
        let url = URL(string: str),
        let image = NSImage(contentsOf: url)
    {
        tager.image = image
    }
}

擴(kuò)展知識

圖片縮放

NSImageView中如果圖片比視圖的邊框小,圖片則會(huì)被放大以適應(yīng)邊框的大小晴竞。但當(dāng)圖片寬高比和視頻的寬高比不一致時(shí)蛙卤,圖片是不會(huì)填滿整個(gè)View的,這個(gè)時(shí)候就會(huì)空白區(qū)域噩死。在iOS里可以修改UIImageViewcontentMode來縮放圖片颤难,但在Cocoa中是沒有該功能,需求我們實(shí)現(xiàn)一個(gè)改變圖片大小的方法來實(shí)現(xiàn)圖片大小自適應(yīng)NSImageView

lazy var imageView: NSImageView = {
    let imageView = NSImageView()
    imageView.frame = NSRect(x: 30, y: 30, width: 100, height: 100)
    var image = NSImage(named: "1.jpeg")
    image = image?.resizeImage(NSSize(width: 100, height: 100))
    imageView.image = image
    return imageView
}()
extension NSImage {
    public func resizeImage(_ size: NSSize) -> NSImage {
        let targetFrame = NSRect(origin: CGPoint(x: 0, y: 0), size: size);
        let targetImage = NSImage(size: size)
        let selfSize = self.size
        let ratioHeight = size.height / selfSize.height
        let ratioWidth = size.width / selfSize.width
        var cropRect = NSZeroRect
        if ratioHeight >= ratioWidth {
            cropRect.size.width = floor (size.width / ratioHeight)
            cropRect.size.height = selfSize.height
        } else {
            cropRect.size.width = selfSize.width
            cropRect.size.height = floor(size.height / ratioWidth)
        }

        cropRect.origin.x = floor((selfSize.width - cropRect.size.width) / 2)
        cropRect.origin.y = floor((selfSize.height - cropRect.size.height) / 2)

        targetImage.lockFocus()
        self.draw(in: targetFrame,
                  from: cropRect,
                  operation: .copy,
                  fraction: 1.0,
                  respectFlipped: true,
                  hints: [
                            NSImageRep.HintKey.interpolation : NSImageInterpolation.low.rawValue
                          ])

        targetImage.unlockFocus()
        return targetImage
    }  
}

小結(jié)

ImageView只要是用來顯示圖片已维,比如在一些相冊行嗤、桌面圖片應(yīng)用中使用得非常頻繁,也是最常用的組件之一衣摩。在這之前昂验,一直在說基礎(chǔ)控件,那么在下一節(jié)中艾扮, 我們將來搞有意思的事情既琴。源碼請?jiān)L問這里:https://github.com/dengyhgit/macOS-Dev-Demo/tree/master/NSImageView, 如對你有幫忙泡嘴,別忘點(diǎn)亮小??甫恩。更多內(nèi)容,請關(guān)注我的公眾號:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酌予,一起剝皮案震驚了整個(gè)濱河市磺箕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抛虫,老刑警劉巖松靡,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異建椰,居然都是意外死亡雕欺,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門棉姐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來屠列,“玉大人,你說我怎么就攤上這事伞矩〉崖澹” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵乃坤,是天一觀的道長苛让。 經(jīng)常有香客問我沟蔑,道長,這世上最難降的妖魔是什么蝌诡? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任溉贿,我火速辦了婚禮,結(jié)果婚禮上浦旱,老公的妹妹穿的比我還像新娘宇色。我一直安慰自己,他們只是感情好颁湖,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布宣蠕。 她就那樣靜靜地躺著,像睡著了一般甥捺。 火紅的嫁衣襯著肌膚如雪抢蚀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天镰禾,我揣著相機(jī)與錄音皿曲,去河邊找鬼。 笑死吴侦,一個(gè)胖子當(dāng)著我的面吹牛屋休,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播备韧,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼劫樟,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了织堂?” 一聲冷哼從身側(cè)響起叠艳,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎易阳,沒想到半個(gè)月后附较,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潦俺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年翅睛,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黑竞。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖疏旨,靈堂內(nèi)的尸體忽然破棺而出很魂,到底是詐尸還是另有隱情,我是刑警寧澤檐涝,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布遏匆,位于F島的核電站法挨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏幅聘。R本人自食惡果不足惜凡纳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望帝蒿。 院中可真熱鬧荐糜,春花似錦、人聲如沸葛超。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绣张。三九已至答渔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侥涵,已是汗流浹背沼撕。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芜飘,地道東北人务豺。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像燃箭,于是被迫代替她去往敵國和親冲呢。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Button是一個(gè)用戶界面對象招狸,單擊該按鈕即可將操作消息發(fā)送到目標(biāo)敬拓。它的大部分工作都由NSButtonCell處理...
    YxxxHao閱讀 1,471評論 0 4
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友裙戏。感恩相遇乘凸!感恩不離不棄。 中午開了第一次的黨會(huì)累榜,身份的轉(zhuǎn)變要...
    迷月閃星情閱讀 10,567評論 0 11
  • 彩排完营勤,天已黑
    劉凱書法閱讀 4,218評論 1 3
  • 沒事就多看看書,因?yàn)楦褂性姇鴼庾匀A壹罚,讀書萬卷始通神葛作。沒事就多出去旅游,別因?yàn)闆]錢而找借口猖凛,因?yàn)橹灰闶〕詢€用赂蠢,來...
    向陽之心閱讀 4,788評論 3 11
  • 表情是什么,我認(rèn)為表情就是表現(xiàn)出來的情緒辨泳。表情可以傳達(dá)很多信息虱岂。高興了當(dāng)然就笑了玖院,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 125,079評論 2 7