【譯文】iOS 10 人機界面指南(五)

7. UI視圖(UI Views)

? ? 7.1 操作列表(Action Sheets)

? ? 7.2 活動視圖(Activity Views)

? ? 7.3 警告框(Alerts)

? ? 7.4 集合(Collections)

? ? 7.5 圖片視圖(Image Views)

? ? 7.6 地圖(Maps)

? ? 7.7 頁面(Pages)

? ? 7.8 浮出層(Popovers)

? ? 7.9 滾動視圖(Scroll Views)

? ? 7.10 分屏視圖(Split Views)

? ? 7.11 表格(Tables)

? ? 7.12 文本視圖(Text Views)

? ? 7.13 網頁視圖(Web Views)

7. UI視圖(UI Views)

7.1 操作列表(Action Sheets)

操作列表是一種對某個控件或操作作出應答的特殊形式的警告框,它展示了與當前內容相關的一組選項(兩個或更多)。使用操作列表讓用戶觸發任務,或是在用戶執行某個有潛在破壞性的操作前請求用戶確認。在小屏幕,操作列表從屏幕底部向上滑出。在大屏幕,操作列表會以浮出層的形式突然出現。

提供取消按鈕,如果它能加強明確性。當用戶想要放棄任務時,取消按鈕給予了他們信心。屏幕底部出現的操作列表最下方應該有個取消按鈕。

突出破壞性的選項。對那些執行破壞性或危險操作的按鈕使用紅字,并且在操作列表的頂部放置這些按鈕。

避免讓用戶滾動操作列表。如果操作列表有太多選項,用戶就必須通過滾動查看所有的選項。滾動需要用戶花更多的時間做決定,并且在滾動過程中容易誤點某個選項。

了解開發細節,請參閱UIAlertController中的UIAlertControllerStyleActionSheet。

7.2 活動視圖(Activity Views)

一個活動就是一個在當前環境下有意義的任務,比如復制、收藏或是查找。一旦活動被觸發,它可以立即執行一個任務,也可以在開始前請求更多的信息?;顒佑苫顒右晥D管理,根據設備和橫豎屏的不同,以表單或浮出層的形式出現。使用活動向用戶提供你的app能夠執行的自定義服務或任務。

系統提供了一系列內置的活動,比如打印、Twitter、信息和Airplay。這些任務總是在活動視圖的最前列出現,并且不能被重新排列。你無須為執行這些內置任務創建自定義活動?;顒右晥D還能展示來自其它app的分享和操作插件。請參閱Sharing and Actions。

設計能夠代表你的自定義活動的簡單的模板圖像。模板圖像(template image)利用遮罩(mask)創建圖標。模板圖像應使用透明度合適和經過抗鋸齒處理的黑色和白色,并且不包含陰影。模板圖像應該被放置在一塊大約為70px*70px尺寸的區域中心。

設計能夠簡扼描述你的任務的活動標題。在活動視圖中,標題顯示在圖標下方。短標題是最佳的。當標題過長,iOS首先會縮小字體,若文本實在過長, iOS會截斷它。一般來說,避免在標題中包含你的公司或產品名字。

確?;顒釉诋斍碍h境中是合適的。雖然系統提供的任務在活動視圖中不能被重新排列,但當它們對你的app不適用時,你可以去除它們。比如,你可以通過去除打印活動而阻止用戶在你的app中打印圖片。你也可以在特定的時候讓特定的自定義任務出現。

通過操作按鈕呼出操作視圖。用戶已經習慣了通過點擊操作按鈕來進入系統提供的活動。避免用其它方式替代,從而讓用戶感到困惑。

了解開發細節,請參閱UIActivityViewContollerUIActivity。

7.3 警告框(Alerts)

警告框傳達了與你的app或設備狀態相關的重要信息,并且通常在請求用戶反饋。警告框由標題、描述信息(可選)、一個或多個按鈕和用于獲取用戶輸入的文本框(可選)。除了這些可配的元素之外,警告框的視覺外觀是固定的的且不能被自定義。

盡可能少地使用警告框。警告框會中斷用戶體驗,只有在重要情境下才能使用,比如確認購買、破壞性操作(如刪除),或是通知用戶當前出現了問題。正是因為警告框的罕見性,才讓用戶更加重視警告框。確保每個警告框都提供了關鍵的信息和有用的選項。

在橫屏和豎屏下雙重測試警告框的外觀。警告框可能在橫屏和豎屏模式下看起來有所區別。優化警告框文本,確保用戶在任一模式下都無需滑動操作即可完整閱讀。

了解開發細節,請參閱UIAlertController

警告框標題和信息

使用簡短的、描述性的、多詞語的警告框標題。用戶需要在屏幕上閱讀的文本越短越好。嘗試更多地推敲標題,以避免額外添加信息文本。由于單詞語的標題很少能提供有用信息,考慮使用問句或是短句。盡可能控制標題字數在一行內。使用句子式大寫,并用合適的標點符號為句子結尾。不要給句子片段(譯者注:不完整的殘缺句)加上結束標點。

如果你必須提供一段信息,請使用簡短、完整的句子。盡量將說明信息控制在一到兩行之內,這樣用戶就無需通過滾動查看。使用句子式大寫和合適的標點符號。

避免使用指責的、苛刻的或是無禮的語氣。用戶知道警告框是為了通知他們發生的問題和危險情況。只要你使用友好的語氣,那么表現地消極和直接一些好過一味的積極和隱晦。避免使用“你”、“你的”、“我”和“我的”之類的代詞,因為它們常被理解為無禮和傲慢。

避免對警告框按鈕做出解釋。如果警告框文本和按鈕標題足夠明了,那么就無需對按鈕的用途做出多余的解釋。在極少數需要為按鈕提供指導的情況下,請使用詞語“輕擊(tap)”,并且在提到按鈕名稱時使用大寫,并且不要添加雙引號。

警告框按鈕

通常情況下,使用雙按鈕警告框。雙按鈕警告框提供了在兩個選項中快速抉擇的途徑。單按鈕警告框只負責通知,卻未給予用戶對當前情勢的控制權。擁有三個或以上按鈕的警告框增加了復雜性,并可能需要滾動操作,而這恰是一種不良的用戶體驗。如果你發現自己需要兩個以上的按鈕,可以考慮用操作列表代替。請參閱Action Sheets

使用簡明合理的按鈕標題。最好的按鈕標題應該包含一個或兩個能夠描述選擇按鈕后的結果的詞語。對于所有的按鈕標題,使用標題式大寫,并且不含標點符號。盡可能地,使用與警告框標題或信息直接對應的動詞或動詞性詞組,比如,“查看全部”、“回復”、或“忽略”。使用“好的(OK) ”表示簡單的接受。避免使用“是”或“否”。

在用戶預期的位置放置按鈕。一般來說,用戶最可能輕擊的按鈕應該在右邊。取消按鈕應該在左邊。

為有取消功能的按鈕合理命名。一個能夠取消警告框操作的按鈕就該被命名為“取消”。

識別會產生破壞性結果的按鈕。如果一個警告框按鈕會產生破壞性的操作,比如刪除內容,那么請將按鈕樣式設定為“Destructive”,這樣它就能通過系統獲取合適的格式。了解開發細節,請參閱UIAlertAction中的UIAlertActionStyleDestructive常量。另外,為用戶提供一個“取消”按鈕,讓它們能夠安全地從破壞性操作中退出。通過標記“取消”按鈕為默認按鈕,來加粗按鈕文本。

允許使用“Home”鍵來取消警告框。當警告框出現時,按住Home鍵會退出app。但同時,它應該也產生和點擊取消按鈕一樣的效果,即在不執行任何操作的情況下關閉警告框。如果你的警告框沒有取消按鈕,那么考慮將點擊Home鍵也會關閉警告框寫入你的代碼中。

7.4 集合(Collections)

一個集合管理著一組有序的內容,比如一組圖片,并且在可自定義的且高度可視化的布局中展示它。因為集合無需執行嚴格的線性格式,所以它尤其適合用來展示大小不同的項目。簡言之,集合是用來展現圖片類內容的理想視圖。背景及其它裝飾性視圖可以選擇性地用于視覺上區分不同組別的項目。

集合同時支持交互性和動畫。默認狀態下,你可以通過輕擊(tap)來選擇,長按(touch and hold)來編輯,以及輕掃(swipe)來滾動。如果你的app需要,你可以加入更多的手勢用于執行自定義操作。在集合中,當項目被插入、刪除或是重新排序時會伴隨默認動畫,你也可以使用自定義動畫。

若標準的行或網格布局已能滿足需求,請避免創造顛覆性的新設計。集合是為了優化用戶體驗,而不是變成關注的中心。讓用戶能更容易選擇一項。如果用戶很難在集合中選中某項,它們會變得沮喪并且很快地在獲得想要的內容前失去興致。在內容周圍留有充足的邊距,保持布局的整潔并避免內容重疊顯示。

對于文本,考慮用表格來替代集合。一般來說,在滾動列表中的文字信息更易于閱讀和理解。

請謹慎地對待布局的動態變化。集合的布局可以隨時被改變。如果你在用戶查看視圖或是與之交互時讓它發生了動態的變化,請確保變化是有意義的并且易于跟蹤。沒有目的的布局變化會讓你的app看起來不可預知并且難用。如果因為布局變化,而導致用戶丟失了當前關注的焦點或是瀏覽的內容,那么他們很可能會覺得自己無法再控制這個app了。

了解開發細節,請參閱UICollectionView。

7.5 圖片視圖(Image Views)

圖片視圖在透明或不透明的背景上展示一張圖片或是一組圖片的動態序列。在圖片視圖中,圖片可以被拉伸、縮放、根據屏幕調整大小,或是固定在特定位置。默認情況下圖片視圖是不可交互的。

可能時,確保一個圖片視圖內的所有圖片都尺寸一致。如果你的圖片大小不一,圖片視圖就要逐一調整尺寸。使用尺寸一致的圖片比使用不同尺寸的圖片更有效率。若是使用已縮放好的且無需額外調整的圖片就更加高效。

了解開發細節,請參閱UIImageView。

Note

模板圖片(template image)會丟棄圖片本身的色彩,而采用圖片視圖使用的色調。請參閱UIImage中的UIImageRenderingModeAlwaysTemplate

7.6 地圖(Maps)

地圖視圖允許你在app內展示地理數據,并且支持原生地圖應用的大部分功能。地圖視圖可以展示標準地圖、衛星地圖或是兩者兼有。它可以含有定位標簽(大頭針)和疊加圖層,并且支持縮放和平移。

一般來說,保持你的地圖是可交互的。用戶習慣了使用手勢與原生的地圖應用交互,并且希望在你的地圖里也能以相同的方式交互。

使用合理的標簽(大頭針)顏色。大頭針代表著地圖上你感興趣的點。用戶已經熟悉了原生地圖應用中的標準大頭針顏色。避免在你的app中對這些顏色有不同的定義。使用紅色表示重點,綠色表示起點,紫色表示用戶指定的位置。

了解開發細節,請參閱MapKit

7.7 頁面(Pages)

頁面視圖控制器提供了在多頁面內容間(比如在文檔中、書本、筆記本或是日歷中)實現線性導航的方式。頁面視圖控制器通過滾動或翻頁兩種樣式來處理導航時頁面的過渡。滾動過渡沒有特定的外觀;頁面流暢地從當前頁滾動至下一頁。翻頁過渡會在你橫掃屏幕時讓頁面翻卷過去,就好像在現實中里翻書頁一樣。



如果合適的話,設計一種非線性的導航方式。使用頁面視圖控制器時,頁面只能按次序變換,你無法在不相鄰的頁面間跳轉。如果用戶于需要在你的app中不按次序瀏覽頁面,請設計一種滿足該功能的自定義控件。

了解開發細節,請參閱UIPageViewController

7.8 浮出層(Popovers)

浮出層是一個當你點擊某控件或某塊區域時,會在屏幕內其它內容上方出現的暫時視圖。通常來說,浮出層包含一個指向其出現位置的箭頭。浮出層最適合用于大屏幕,并且可以包含任何一種元素,比如導航欄、工具欄、標簽欄、表格、集合、圖片、地圖以及自定義視圖。當浮出層出現時,通常就無法再與其它視圖進行交互,除非浮出層被關閉。利用浮出層來展示與當前屏幕內容相關的選項或信息。比如,非常多的iPad應用會在你點擊分享按鈕后彈出浮出層來展示分享選項。

只在確認和引導時使用關閉按鈕。諸如“取消”或“完成“之類的關閉按鈕,若是能清晰表明操作結果(比如,在保存或未保存狀態下退出),那么就它就有存在的價值。一般來說,當浮出層不再有必要存在時,它應該自動關閉。在大多數情況下,當用戶點擊浮出層外部區域或是選擇了浮出層內的某項后,浮出層應該關閉。如果用戶能在浮出層進行多選,那么只有在用戶明確選擇關閉它或是點擊了浮層的外部區域時,它才會消失。

總是在自動關閉浮出層的同時保存用戶輸入。用戶很容易就會因誤點屏幕其它區域而將浮出層關閉。只有在用戶明確點擊“”取消“”按鈕的情況下才可以丟棄他們的輸入。

在屏幕上的合適位置放置浮出層。浮出層的箭頭應該盡可能地指向將浮層呼出的元素。由于浮出層無法在屏幕中被拖動,所以它不應該遮擋住用戶在使用浮出層時可能會需要查看的重要內容。浮出層也不應該遮擋住觸發它的元素。

同一時間只展示一個浮出層。同時展示多個浮層會導致界面雜亂無章,并讓用戶感到困惑。永遠都不要通過一個浮出層觸發另一個浮出層的方式,在屏幕上展示并列或堆疊的多個浮層。如果你需要展示一個新的浮層,請關閉當前的浮層。

不要在浮出層上展示其它的視圖。除了警告框,任何其它視圖都不應該出現在浮出層之上。

可能時,讓用戶通過一次點擊就可關閉當前浮層并且打開新浮層。當欄上有多個不同的按鈕且每個會呼出一個浮出層時,尤其應當考慮避免不必要的點擊次數。

避免設計過大的浮出層。浮出層不應該占據整個屏幕。設計一個尺寸足以展示其內容的浮出層,并且指向呼出它的地方。請注意系統可能會調整浮出層的尺寸以保證其在屏幕上完美展現。

確保自定義浮出層看起來還是一個是浮出層。雖然你可以自定義浮出層的大部分視覺外觀,但是避免創造一個用戶可能辨認不出是浮出層的設計。含有標準控件和視圖的浮出層最容易被用戶接受。

當浮出層的尺寸變動時提供流暢的過渡動畫。有些浮出層會為相同的信息同時提供精簡和拓展視圖。如果你要調整浮出層的尺寸,請使用轉場動畫以避免給用戶造成新浮層取代舊浮層的印象。

了解開發細節,請參閱UIPopoverPresentationController。

7.9 滾動視圖(Scroll Views)

滾動視圖讓用戶能夠瀏覽超出屏幕可見范圍的內容,比如文檔中的文本或是一個集合的圖片。當用戶輕掃、滑動、拖曳、輕擊以及捏合時,滾動視圖會遵循用戶的手勢,以一種自然的方式顯示或是縮放內容。滾動視圖本身沒有外觀,但是在用戶與之交互時會顯示一個暫時性的滾動指示器( scrolling indicator)。滾動視圖也可以被設置為分頁模式,此時滾動手勢會展開一個全新的頁面,而不是在當前頁面來回移動。

合理地支持縮放操作。如果你的app需要,可以讓用戶通過捏合或者雙擊來縮放。當你允許縮放時,請設置有意義的最大和最小比值。比如,對一個文本不斷放大直到其填充屏幕的行為可能在大部分的app中毫無意義。

當滾動視圖處于分頁模式時,考慮顯示頁面控件元素。頁面控件表明了分頁、分屏或者分塊內容的可得總量,并且指明了當前顯示的是哪一個。如果你在滾動視圖中展示了頁面控件,請禁用處在同軸的滾動指示器以避免混淆。了解更多指導,請參閱Page Control。

不要在一個滾動視圖內放置另一個滾動視圖。這么做會產生一個難以控制且不可預知的界面。

一般而言,同一時間只展示一個滾動視圖。在滾動視圖內,用戶常會作出幅度很大的輕掃手勢,這樣一來,就很難避免和同屏內相鄰的滾動視圖發生交互。如果你需要在一屏內放置兩個滾動視圖,考慮讓他們在不同的方向滾動,這樣一個手勢就不太可能同時作用于兩個視圖。比如,當iPhone處于豎屏模式時,“股市”app會在水平滑動的公司詳情視圖上方展示垂直滾動的股票報價列表。

了解開發細節,請參閱UIScrollView。

7.10 分屏視圖(Split Views)

分屏視圖用于展示兩塊相鄰窗格的內容,主窗格上的內容保持不變,而次窗格會展示相關的信息。每一個窗格都能包含任意種類的元素,包括導航欄、工具欄、標簽欄、表格、集合、圖片、地圖以及自定義視圖。分屏視圖一般用于展示可分類內容:主窗格展示一列類別目錄,次窗格展示經選中類目篩選后的結果。如果你的app需要,主窗格可以覆蓋在次窗格上,并且在不需要的時候被隱藏至屏幕外。這點在設備處于豎屏模式時尤為重要,因為它為瀏覽次窗格上的內容提供了更多的空間。

選擇一個適用于你的內容的分屏視圖布局。默認的分屏視圖分別將1/3和2/3的空間分配給主窗格和次窗格。但是屏幕也可以被平分為兩半。根據你的內容來選擇合適的分屏,并保證兩個窗格不會看起來不平衡。避免設計一個比主窗格還窄的次窗格。

保持主窗格里被激活的選項高亮。盡管次窗格的內容會變化,它應該永遠與主窗格里清晰易辨的選中項相對應。這樣有助于用戶理解主次窗格之間的關系。

一般地,限制導航于分屏視圖的一側。在分屏視圖的兩個窗格都放置導航會讓用戶很難保持方向感,并且會難以明白兩個窗格間的關系。

為重新呼出被隱藏的主窗格提供多種方式。在一些主窗格可能會離開屏幕的布局中,請確保能提供提供一個按鈕——一般在導航欄上——用于重新呼出主窗格。除非你的app已將滑動手勢來于執行其它功能,否則請允許用戶也能通過從屏幕邊緣輕掃(swipe)來呼出主窗格。

了解開發細節,請參閱UISplitViewController。

7.11 表格(Tables)

表格通過一個可以滾動的、單欄的行列表來呈現數據,這個行列表可以被分成不同的段落或群組。使用表格以列表的形式來整齊高效地展示大量或少數的信息。一般來說,表格最最適合于基于文本的內容,并且通常在分屏視圖的一側作為導航出現,并伴有顯示在另一側的相關內容。請參閱“分屏視圖Split Views”。

iOS采用兩種類型的表格:平鋪型(plain)和分組型(grouped)。

平鋪型

平鋪型。行列表可以被分為幾個帶有標簽的段落,在表格右邊界的還可以有一條縱向索引。頁眉可以出現在每個段落的第一項之前,頁腳可以出現在最后一項之后。

分組型

分組型。行列表以分組的形式展示,常伴有頁眉和頁腳。這種類型的表格最起碼含有一個分組,且每個分組最少含有一行。分組型表格不含有索引。

考慮表格的寬度。過窄的表格會造成文本截斷和重疊,導致用戶難以在較遠距離快速閱讀和瀏覽。過寬的表格也不易于閱讀和瀏覽,還可能會讓內容缺少空白(譯者注:填滿文本的寬表格)。

一開始就快速顯示表格內容。不要等到全部表格內容加載完后,才向用戶展示。應該先立即填充表格上的文本數據,然后當較為復雜的數據加載完成時再展示它們——比如圖片。這個技巧讓用戶立即獲得有用的信息,并提升了你的app在用戶認知中的響應性。在某些情況下,在新數據到達前展示過時的老數據也能行得通。

加載內容時告知進度。如果一個表格的數據需要一定時間來加載,可以展示一個進度條或者緩沖圖標(spinning activity indicator)來告知用戶你的app仍在加載中。

保持更新內容考慮定時更新你的表格內容以反映最新數據。但是不要更改滾動頁面的定位。反之,在表格的開頭或是末尾添加新的內容,并在它們準備就緒時允許用戶滑動至新內容。一些apps會在新數據被添加時顯示一個標志(indicator),并提供一個能夠直接跳轉至新內容的控件。在頁面中包含一個刷新控件也是個好主意,這樣用戶就可以在任意時刻手動執行刷新操作。請參閱“內容刷新控件Refresh Content Controls”

避免在含有右對齊元素的表格行中包含索引。索引是通過大幅度的滑動手勢來控制的。如果其它可交互元素在它附近,比如展開按鈕(disclosure indicators),那么就很難辨別用戶手勢的意圖,并且很可能會激活錯誤的元素。

了解開發細節,請參閱UITableView

表格行

你使用標準的表格單元格樣式來決定如何在表格行中展示內容。

默認型

默認型(Default)。行左端可以有圖片,并跟隨左對齊的標題。該樣式適用于展示無需補充信息的項目。了解開發細節,請參閱UITableViewCell中的UITableViewCellStyleDefault?constant。

副標題型

副標題型(Subtitle)。一行左對齊的標題和下一行左對齊的副標題。這種樣式適用于行和行視覺上相似的表格。額外的副標題幫助區分行與行。了解開發細節,請參閱UITableViewCell中的UITableViewCellStyleSubtitle?constant。

Value 1

Value 1。左對齊的標題和同處一行的右對齊且顏色較淺的副標題。了解開發細節,請參閱UITableViewCellUITableViewCellStyleValue1?constant。

Value 2

Value 2。右對齊的標題,跟隨著同處一行的左對齊且顏色較淺的副標題。了解開發細節,請參閱UITableViewCell中的UITableViewCellStyleValue2constant。

所有標準表格單元格樣式還可以含有圖形元素,比如一個選中標記或關閉圖標。然而毫無疑問,添加圖形元素會減少標題和副標題的可用空間。

保持文本的簡練以避免被截斷。被刪減的單次和詞組不容易被瀏覽和理解。無論使用哪種表格單元格樣式,文本截斷都是自動的,但是這個問題的嚴重性由不同的單元格樣式和不同的截斷位置決定。

考慮為刪除按鈕使用自定義標題。對于支持刪除功能的行,如果有助于用戶理解,可以將按鈕上系統提供的“刪除”文本換成自定義標題。

選中時提供反饋。用戶期望被選中行能在被點擊時短暫高亮。然后,用戶期待出現一個新的視圖或者某些元素發生改變,比如出現一個選中標記,表示已經做出了選擇。

為非標準的表格行設計一個自定義的表格單元格樣式。標準的樣式能很好地運用于多種常見的情境中,但是某些內容或是你的整體app設計可能會需要一個高度自定義的表格外觀。學習如何創建你自己的單元格,請參閱Table View Programming Guide for iOS中的Customizing Cells。

了解開發細節,請參閱UITableViewCell。

7.12 文本視圖(Text Views)

文本視圖用于展示多行的、帶有樣式的文本內容。文本視圖可以是任意高度,當內容超出視圖邊界時可以允許滾動。默認地,文本視圖的內容采用左對齊的方式,并且使用黑色的系統字體。如果文本視圖支持編輯,當你在視圖內點擊后會出現一個鍵盤。

保持文本清晰可讀。盡管你可以富有創意地使用多種字體、顏色甚至對齊方式,保持內容的可讀性是最基本的要求。采用動態文本(Dynamic Type)是個好主意,這樣即使用戶在他們的設備上更改了文本大小,你的文本依舊會看起來很棒。你應該在不同的輔助功能選項下測試你的內容,比如粗體文本。

展示合適的鍵盤類型。iOS提供了多種不同的鍵盤類型,以便于不同類型的輸入。為了簡化數據錄入,在編輯文本視圖時顯示的鍵盤應該適用于當前域的文本類型。了解完整的可用鍵盤類型,請參閱UITextInputTraits中的UIKeyboardTypeconstant。

了解開發細節,請參閱UITextView。

7.13 網絡視圖(Web Views)

網絡視圖能直接在你的app中加載和呈現豐富的網絡內容,比如嵌入的HTML和網站。比如,“郵件”就使用了網絡視圖來在信息中展示HTML內容。

合適時啟用前進和后退導航。網絡視圖支持前進和后退導航,但是這種行為被默認禁止。如果用戶將在你的網絡視圖中瀏覽多個頁面,請啟用前進和后退導航,并為這些功能提供對應的控件。

避免使用網絡視圖來構建一個網絡瀏覽器。讓用戶在不離開你的app的情況下通過網絡視圖暫時性地進入一個網站是可以的,當時Safari才是用戶瀏覽網頁的主要方式。試圖在你的app中復制Safari的功能是沒有意義且不被鼓勵的行為。

了解開發細節,請參閱WKWebView。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容