丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
專欄 正文
發(fā)私信給稀土
發(fā)送

0

iOS開發(fā)中,如何解決彈窗設(shè)計問題?

本文作者: 稀土 2016-08-05 09:21
導(dǎo)語:關(guān)于iOS彈窗設(shè)計的思考

雷鋒網(wǎng)按:本文由掘金翻譯計劃譯者llp0574譯自Douglas HillPreventing Popovers on Popovers》,校對者:yifili09Graning。本文首發(fā)稀土掘金,未經(jīng)允許,禁止轉(zhuǎn)載。

iOS開發(fā)中,如何解決彈窗設(shè)計問題?

iOS 9的頁面用了一種我們不能復(fù)現(xiàn)的方式去展示一個活動視圖控制器,并且當(dāng)從內(nèi)部表單和彈窗呈現(xiàn)操作列表和活動視圖控制器時UIKit的行為一開始看起來不那么連貫。我們提交了兩份Radars給蘋果:Can't show activity view controller filling a form sheet 和 Reading an alert controller's popoverPresentationController property changes behavior.

iOS的人機(jī)交互指南聲明:

不要在一個彈窗上展示一個模態(tài)視圖。 由于一個警告彈窗可能是一個異常,所以不應(yīng)該在這上面展現(xiàn)任何東西。極少數(shù)情況下,當(dāng)你真的需要在一個動作導(dǎo)致彈窗后展示一個模態(tài)視圖時,應(yīng)該先把彈窗關(guān)閉掉再進(jìn)行展示。

并且

一次只展示一個彈窗。 展示多個彈窗會讓交互變得雜亂并讓人產(chǎn)生疑惑。千萬不要展示一個級聯(lián)或者有層次結(jié)構(gòu)的彈窗,一個從另一個里面產(chǎn)生的那種。如果你需要展示一個新的彈窗,首先關(guān)閉已經(jīng)彈出的那個。

在橫向水平的普通環(huán)境和全屏緊湊的環(huán)境下具有彈窗樣式的視圖控制器都應(yīng)該呈現(xiàn)為彈窗。具有操作列表樣式的UIActivityViewControllerUIAlertController都遵守相同的規(guī)則:展示為彈窗或者一個上拉式表。所以如果一個彈窗展示一個活動視圖控制器或者一個操作列表到底會發(fā)生什么?這個人機(jī)交互指南文檔的說法好像有點矛盾。

在iOS 9頁面的一個相關(guān)說明里,我們注意到在一個表單的視圖控制器展示了一個填充了這個表單的UIActivityViewController,想知道這是不是一個我們之前沒有留意到的默認(rèn)行為呢?又或者它是不是一個我們可以自定義實現(xiàn)的東西?

iOS開發(fā)中,如何解決彈窗設(shè)計問題?

對于大多數(shù)視圖控制器來說,在里面展示一個彈窗或者表單需要將當(dāng)前視圖控制器的modalPresentationStyle設(shè)置為currentContext或者overCurrentContext。但對于某些像UIActivityViewControllerUIAlertController這種UIKit提供的視圖控制器來說,它們已經(jīng)被賦予了自己的樣式,modalPresentationStyle的變化將被忽略掉。

一般,UIActivityViewController會在常規(guī)寬度下展示為彈窗,在緊湊寬度下變成一個透明的表。但是如果一個常規(guī)寬度的視圖控制器要從一個緊湊寬度的視圖控制器里展示會怎么樣呢?這種情況會在一個有表格或者彈窗modalPresentationStyle的視圖控制器要在iPad上展示,或者它是一個使用了overrideTraitCollection屬性的自定義展示控制器,然后這個控制器展示了一個UIActivityViewController。

iOS開發(fā)中,如何解決彈窗設(shè)計問題?

操作列表

首先我們來看看UIAlertController。圖中根視圖控制器(青色)用彈窗樣式(下方,通過切分視圖行為以作參考)展示了第二個用表單樣式(上方)的視圖控制器(粉色)。然后第二個視圖控制器展示了一個操作列表樣式的警告控制器。

iOS開發(fā)中,如何解決彈窗設(shè)計問題?

雖然我們想要用列表的展示樣式去展示操作列表(而不是彈窗),但因為關(guān)注點分離的優(yōu)勢,我設(shè)置了警告控制器的popoverPresentationController.sourceViewpopoverPresentationController.sourceRect,視圖控制器不應(yīng)該對它怎么展示作出假設(shè)。它應(yīng)該在app的其他部分進(jìn)行全屏展示,視圖控制器不應(yīng)該控制這些行為。

出于好奇,我嘗試注釋掉了popoverPresentationController的定義,發(fā)生了讓我意想不到的情況:

iOS開發(fā)中,如何解決彈窗設(shè)計問題?

iOS開發(fā)中,如何解決彈窗設(shè)計問題?

原來只讀取警告控制器的popoverPresentationController屬性會導(dǎo)致即使是從一個緊湊寬度環(huán)境下呈現(xiàn)它也會展示為一個彈窗。如果你想這么做,請一定要確保好視圖控制器展現(xiàn)的前后環(huán)境,因為如果你想從常規(guī)寬度的環(huán)境展現(xiàn)一個沒有設(shè)置彈窗源碼的警告控制器,UIKit就會拋出一個異常。切記在展現(xiàn)觸發(fā)的時候即使呈現(xiàn)視圖控制器是在一個緊湊寬度環(huán)境下,當(dāng)展示被激活的時候它還是有可能發(fā)生改變。

我提交了一個rdar:Reading an alert controller's popoverPresentationController property changes behavior.

活動視圖控制器

UIActivityViewController做同樣的事情,并指定彈窗源碼信息,出現(xiàn)下面的情況:

iOS開發(fā)中,如何解決彈窗設(shè)計問題?

iOS開發(fā)中,如何解決彈窗設(shè)計問題?

不同于頁面的行為,我發(fā)現(xiàn)表單把這個活動視圖控制器展示為一個彈窗,彈窗將活動視圖控制器展示在表單上。這是在iOS 10的新行為,iOS 9里,是從另一個彈窗展示一個彈窗。

用同樣不訪問popoverPresentationController的技巧導(dǎo)致UIKit拋出一個異常說“必須為這個彈窗提供位置信息”。

結(jié)論

我們發(fā)現(xiàn)當(dāng)UIKit的視圖控制器是從一個展示在常規(guī)寬度環(huán)境的緊湊寬度的環(huán)境中展示時行為會變得很混亂。彈窗展現(xiàn)的一般規(guī)則是在常規(guī)寬度下展示為彈窗,在緊湊寬度下為全屏(盡管結(jié)合當(dāng)前上下環(huán)境更有意義)。操作列表和活動視圖控制器的展示有點像彈窗的展示,但不要完全按照一般的規(guī)則來展示。

實際的行為看起來像是和人機(jī)交互指南說的一樣,并很大程度上忽略了特征集合的Size類。UIKit不會在操作列表的異常警告上展現(xiàn)一個彈窗。Size類并不能控制所有的東西。

我們不能重現(xiàn)頁面(Pages)的行為。對于我們來說,當(dāng)一個表單展示一個活動視圖控制器時,它將展示為彈窗。我把這個問題報告給了Apple(Radar:Can't show activity view controller filling a form sheet)。

雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

iOS開發(fā)中,如何解決彈窗設(shè)計問題?

分享:
相關(guān)文章

專欄作者

稀土掘金,挖掘最優(yōu)質(zhì)的互聯(lián)網(wǎng)技術(shù) https://juejin.im
當(dāng)月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說