IOS開發(fā)入門之四——開始純代碼寫UI

接上一節(jié)洛心,我們了解到簡(jiǎn)簡(jiǎn)單單的幾行代碼就可以寫出一個(gè)動(dòng)畫乳讥,本節(jié)將進(jìn)一步對(duì)IOS的純代碼UI開發(fā)做簡(jiǎn)單的入門考蕾。

? ? 什么是UI開發(fā):這是給小白解釋掖肋,熟人請(qǐng)繞過。手機(jī)的App可以認(rèn)為是由一個(gè)一個(gè)頁(yè)面組成蹂楣。就好比你現(xiàn)在正在看的這個(gè)網(wǎng)頁(yè)俏站,就可以認(rèn)為是一個(gè)頁(yè)面,如果點(diǎn)擊了這個(gè)網(wǎng)頁(yè)上的一個(gè)按鈕痊土,就會(huì)跳到另外一個(gè)地方肄扎,這就跳到另外一個(gè)頁(yè)面了。編寫這些頁(yè)面內(nèi)容赁酝,就叫UI開發(fā)犯祠。UI開發(fā)直接影響用戶的體驗(yàn),在移動(dòng)App開發(fā)中占有很重的比例赞哗,每一個(gè)IOS開發(fā)人員都必須掌握雷则。本節(jié)介紹一種UI開發(fā)方法:用純代碼來寫UI。

一肪笋、創(chuàng)建工程

打開Xcode創(chuàng)建一個(gè)IOS的"Single View App"工程月劈,不懂創(chuàng)建的人請(qǐng)參看"IOS開發(fā)入門之二——第一個(gè)App",創(chuàng)建后的界面如下圖所示:

二藤乙、工程目錄簡(jiǎn)介

? ? 上圖界面中左側(cè)有很多的文件夾猜揪,大致了解一些這些文件夾的作用:

? ? 外側(cè)的四個(gè)大文件夾:

? ? 1. Products: 主要用于mac電腦開發(fā),IOS開發(fā)用不到坛梁。

? ? 2. MyFirstAppTests: 用于單元測(cè)試而姐。

? ? 3. MyFirstAppUITests: 用于UI測(cè)試。

3. MyFirstApp: IOS開發(fā)的內(nèi)容主要都是存放在這個(gè)文件夾中划咐。

MyFirstApp這個(gè)文件夾又包含:

? ? 3.1? AppDelegate.swift:代表應(yīng)用程序拴念,App初始化需要的內(nèi)容都在這里做,App是從這里開始啟動(dòng)的褐缠,這個(gè)文件暫時(shí)不做深入政鼠。

3.2 ViewController.swift: 這是IOS視圖控制器,其實(shí)說白了就是一個(gè)頁(yè)面的容器队魏,我們編寫UI代碼都要寫在這個(gè)容器里公般,這是本節(jié)重點(diǎn)關(guān)注的文件。

? ? 3.3 Main.storyboard: storyboard文件可以幫助我們用比較直觀的方式來快速的開發(fā)UI胡桨,通過這個(gè)文件我們可以看到我們?cè)O(shè)計(jì)的頁(yè)面長(zhǎng)什么樣子官帘。比如,我們要在頁(yè)面上添加一張圖片昧谊,我們只要將一個(gè)圖片的控件直接拉到storyboard上刽虹,就可以看到這個(gè)圖片在頁(yè)面上到底是大是小,位置在哪里等等揽浙。這是IOS推薦的UI開發(fā)模式状婶。有人要問了意敛,那我們還要用代碼寫UI,不是很麻煩嗎膛虫?其實(shí)這兩種方式寫UI各有優(yōu)缺點(diǎn)草姻,我們可以取長(zhǎng)補(bǔ)短,這在后面講到storyboard的時(shí)候再討論稍刀。Main.storyboard顧名思義就是主頁(yè)面撩独。storyboard設(shè)計(jì)后效果如下圖。

4. Assets.xcassets: 這個(gè)文件夾主要用于存放資源文件账月,比如圖片

5. LauchScreen.storyboard: 顧名思義就是啟動(dòng)頁(yè)面综膀,在打開一個(gè)App的時(shí)候,一般不會(huì)直接跳到主頁(yè)面局齿,經(jīng)常會(huì)先來個(gè)某某公司或則廣告圖片什么的剧劝,這就是啟動(dòng)頁(yè)。

? ? 6. info.plist: 這個(gè)文件是項(xiàng)目的配置文件抓歼。比如主頁(yè)面是哪個(gè)頁(yè)面讥此,所以Main.storyborad也不一定就是主頁(yè)面,因?yàn)樵谶@里可以修改谣妻。

三萄喳、認(rèn)識(shí)視圖

? ? 下面我們重點(diǎn)關(guān)注ViewController.swift這個(gè)文件,單擊這個(gè)文件蹋半,得到如下界面(紅框和箭頭是我做的標(biāo)記)他巨,下面逐一解釋代碼的作用

import UIKit:UIKit是IOS提供給我們專門用于編寫UI代碼的庫(kù),import是導(dǎo)入的意思减江,導(dǎo)入U(xiǎn)IKit這個(gè)庫(kù)后就可以在后續(xù)代碼中用其提供的類來寫UI染突。以后要使用第三方提供的庫(kù),類似也要這么導(dǎo)入辈灼。

? ? ViewController:UIKit庫(kù)中一個(gè)重要的類觉痛,顧名思義“視圖控制器”∫鹦荩可以先這么認(rèn)為吧,一個(gè)ViewController代表一個(gè)頁(yè)面的容器手蝎。也就是一個(gè)頁(yè)面對(duì)應(yīng)一個(gè)ViewController榕莺。所以很明顯,我們的UI代碼應(yīng)該寫在ViewController類里面棵介。

? ? viewDidLoad(): 這是UIViewController中的一個(gè)方法钉鸯,代表頁(yè)面已經(jīng)初始化完畢,這時(shí)頁(yè)面還是空白的邮辽,可以往頁(yè)面中添加其他的UI元素了唠雕,比如圖片贸营、文字。我們要添加的UI代碼都是寫在紅色箭頭所指的地方岩睁。每個(gè)頁(yè)面都有一個(gè)完整的生命周期钞脂,從它開始被創(chuàng)建一直到它被銷毀回收,UIViewController還提供很多的方法捕儒,對(duì)應(yīng)這些不同的生命階段冰啃,有興趣可以自己查找學(xué)習(xí),在這里不做介紹刘莹。

四阎毅、UIView

? ? UIView是UIKit庫(kù)中視圖的基類,代表頁(yè)面中的一個(gè)塊点弯,如下圖大紅框框中的部分就是一個(gè)頁(yè)面扇调,而其中的紅色的塊就是一個(gè)UIView。

? ? 1. 屬性和布局?

? ? 我們對(duì)視圖最關(guān)心的有兩點(diǎn):

? ? a) 它長(zhǎng)什么樣:這稱為視圖的屬性抢肛,比如是什么顏色狼钮、是否有邊框、邊框的顏色雌团、邊框的大小等

? ? b)它應(yīng)該放在頁(yè)面的哪個(gè)位置:這就是布局燃领,布局有兩種方法。一種使用frame锦援,另一種是用AutoLayout猛蔽。

(1)屬性

? ? 對(duì)于以后要用到的其他更高級(jí)的視圖控件,比如UILabel(專門顯示文字)灵寺、UIImageView(專門顯示圖片)曼库、UIButton(按鈕)等都是類似的。只是他們有更多的屬性而已略板。我們學(xué)習(xí)這些視圖毁枯,無非就是熟悉他們的屬性和布局,因此可以舉一反三叮称。

? ? 下面是一段最簡(jiǎn)單的例子:

let purpleView = UIView()?

purpleView.backgroundColor=UIColor.purple?

purpleView.frame=CGRect(x: 0, y: 100, width: 150, height: 150)?

view.addSubview(purpleView)?

可以拷貝到如下圖所示的位置(以后的代碼都是拷貝到類似的位置种玛,就不再貼出這些圖):

? ? let purpleView = UIView() //這句是創(chuàng)建一個(gè)視圖

? ? purpleView.backgroundColor = UIColor.purple //這句是將視圖的背景色設(shè)置為紫色

? ? purpleView.frame = CGRect(x: 0, y: 100, width: 150, height: 150) //這句是設(shè)置視圖的大小和位置:x:0表示視圖與頁(yè)面的左邊距離為0,y:150表示視圖與頁(yè)面的上邊距離為150瓤檐,width:150代表視圖寬度為150赂韵,height:150代表視圖的高度為150

view.addSubview(purpleView) //這句是表示將purpleView這個(gè)視圖添加到的頁(yè)面里

? ? 寫完這些代碼就可以點(diǎn)擊運(yùn)行App了,效果即是上面的紅色方塊圖挠蛉。

? ? IOS用//來注釋代碼祭示,可以用這個(gè)方法將臨時(shí)不用的代碼注釋起來,也可以用來對(duì)代碼進(jìn)行說明谴古。被//注釋后的代碼在程序運(yùn)行時(shí)质涛,將不會(huì)執(zhí)行稠歉。如下圖綠色部分的代碼就是將臨時(shí)不用的代碼注釋起來。

(2)布局

? ? 還可以用自動(dòng)布局AutoLayout的約束方式來限制視圖的位置:

? ? ? ? //創(chuàng)建一個(gè)視圖?

letredView = UIView()?

? ? ? ? //禁止將AutoresizingMask轉(zhuǎn)化為Constraints?

redView.translatesAutoresizingMaskIntoConstraints = false?

? ? ? ? // 背景色為紅色?

redView.backgroundColor = UIColor.red?

? ? ? ? // 將視圖添加到頁(yè)面中?

? ? ? ? view.addSubview(redView)?

? ? ? ? //創(chuàng)建約束汇陆,注意:要在視圖添加到其父容器(在此為頁(yè)面)后怒炸,才能進(jìn)行約束設(shè)置,否則App會(huì)奔潰?

? ? ? ? //寬度約束?

letwidthConstraint = NSLayoutConstraint(item: redView, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 0, constant: 150)?

? ? ? ? //高度約束?

letheightConstraint = NSLayoutConstraint(item: redView, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 0, constant: 150)?

? ? ? ? //頂部約束?

lettopConstraint = NSLayoutConstraint(item: redView, attribute: .top, relatedBy: .equal, toItem: view, attribute: .top, multiplier: 1.0, constant: 100)?

? ? ? ? //左側(cè)約束?

letleftConstraint = NSLayoutConstraint(item: redView, attribute: .left, relatedBy: .equal, toItem: view, attribute: .left, multiplier: 1.0, constant: 150)?

? ? ? ? //在頁(yè)面中添加多個(gè)約束?

? ? ? ? view.addConstraints([widthConstraint,heightConstraint,leftConstraint,topConstraint])?

? ? 用自動(dòng)布局AutoLayout的約束來設(shè)置視圖的位置是比較靈活的瞬测,但是IOS系統(tǒng)提供的這種寫法横媚,明顯太繁瑣。所以一般使用第三方提供的SnapKit庫(kù)來簡(jiǎn)化代碼的寫法月趟,有興趣的人可以查閱相關(guān)資料灯蝴,不懂如何導(dǎo)入第三方庫(kù)的可以參考:IOS如何導(dǎo)入第三方庫(kù)-CocoaPods

2. 動(dòng)畫

上面談到的屬性和布局都是設(shè)置靜止不動(dòng)的內(nèi)容,有時(shí)我們想讓這些圖片或文字能夠動(dòng)起來孝宗,這樣看起來比較有趣穷躁。"IOS開發(fā)入門之三——從一個(gè)動(dòng)畫開始"那節(jié)我們只是簡(jiǎn)單的演示如何產(chǎn)生一個(gè)動(dòng)畫,沒有對(duì)代碼做任何解釋因妇,下面將對(duì)動(dòng)畫代碼做詳細(xì)說明问潭。主要代碼如下:

animView.frame=CGRect(x:0,y:0,width:100,height:100) //設(shè)置動(dòng)畫視圖的尺寸?

animView.center=view.center //動(dòng)畫視圖放在父視圖的正中央?

animView.backgroundColor=UIColor.green//動(dòng)畫視圖的背景色設(shè)置為綠色?

view.addSubview(animView)//將動(dòng)畫視圖添加到父視圖(即頁(yè)面)?

UIView.animate(withDuration: 2,delay:1,usingSpringWithDamping:0.2,initialSpringVelocity:0,options:[.repeat,.autoreverse], animations:{?

self.animView.transform=CGAffineTransform(scaleX: 0.5, y: 0.5)//將動(dòng)畫視圖大小縮小為原來的一半?

},completion:nil)?

? ? 前面四行,是設(shè)置屬性和布局可以參看上面的婚被,不做說明狡忙。我們重點(diǎn)關(guān)注最后一個(gè)方法:

? ? UIView.animate()這個(gè)方法是UIView類提供的一個(gè)靜態(tài)方法,專門用于播放和控制視圖動(dòng)畫址芯。里面的參數(shù)有:

? ? withDuration: 2表示動(dòng)畫總的時(shí)長(zhǎng)為2秒

? ? delay:1表示動(dòng)畫延時(shí)1秒才開始播放灾茁,就是這段動(dòng)畫代碼被執(zhí)行后不馬上播放,而要等1秒鐘后才開始播放谷炸。

? ? usingSpringWithDamping:0.2彈簧動(dòng)畫的阻尼值北专,也就是相當(dāng)于摩擦力的大小,該屬性的值從0.0到1.0之間旬陡,越靠近0拓颓,阻尼越小,彈動(dòng)的幅度越大描孟,反之阻尼越大驶睦,彈動(dòng)的幅度越小,如果大道一定程度匿醒,會(huì)出現(xiàn)彈不動(dòng)的情況啥繁。

? ? initialSpringVelocity:0彈簧動(dòng)畫的速率,或者說是動(dòng)力青抛。值越小彈簧的動(dòng)力越小,彈簧拉伸的幅度越小酬核,反之動(dòng)力越大蜜另,彈簧拉伸的幅度越大适室。這里需要注意的是,如果設(shè)置為0举瑰,表示忽略該屬性捣辆,由動(dòng)畫持續(xù)時(shí)間和阻尼計(jì)算動(dòng)畫的效果。

? ? options后面可以設(shè)置很多可選項(xiàng)此迅,.repeat這個(gè)選項(xiàng)表示動(dòng)畫是重復(fù)的汽畴,.autoreverse這個(gè)選項(xiàng)表示動(dòng)畫播放完畢后會(huì)自動(dòng)倒播,注意這些選項(xiàng)前面要加一個(gè)點(diǎn)耸序。

? ? animations:{}這個(gè)大括號(hào)里面我們要指定視圖最終屬性值忍些。比如我們要讓一個(gè)原來透明度為1的視圖慢慢變?yōu)橥该鞫葹?.5,這個(gè)過程我們不需要關(guān)心坎怪,我們只要在這個(gè)大括號(hào)中將視圖最終0.5這個(gè)值設(shè)置好就行了罢坝。系統(tǒng)會(huì)根據(jù)視圖最初的透明度以及我們?cè)O(shè)置的這個(gè)0.5自動(dòng)生成中間值并用這些值來控制完成動(dòng)畫過程。也就是說搅窿,我們代碼只要告訴系統(tǒng)嘁酿,視圖最終的屬性值是多少系統(tǒng)就會(huì)為我們自動(dòng)生成這些動(dòng)畫過程。

? ? scanX:0.5男应,y:0.5表示這是一個(gè)縮放動(dòng)畫闹司,并且視圖在X方向縮小為原來的一半,Y方向也縮小為原來的一半沐飘,總體看就是方塊整體慢慢縮小一半游桩。

2.1 動(dòng)畫類型

? ? 按照動(dòng)作,動(dòng)畫可分為以下幾個(gè)類型:

? ? (1)平移:? ? ?

self.animView.transform=CGAffineTransform(translationX: -200, y: 20)?

? ? translationX: -200, y: 0表示視圖向左移動(dòng)200距離薪铜,同時(shí)向下移動(dòng)20距離众弓。x正值表示向右移動(dòng),負(fù)值表示向左移動(dòng)隔箍;y正值表示向下移動(dòng)谓娃,負(fù)值表示向上移動(dòng)。

? ? (2)縮放:

self.animView.transform=CGAffineTransform(scaleX: 0.5, y: 0.5)?

? ? scanX:0.5蜒滩,y:0.5表示視圖在x方向縮小為原來的一半滨达,y方向也縮小為原來的一半,總體看就是方塊整體慢慢縮小一半俯艰。x和y的值一般要大于等于0

? ? (3)旋轉(zhuǎn):? ?

self.animView.transform=CGAffineTransform(rotationAngle:CGFloat.pi/4)?

? ? rotaionAngle:CGFloat.pi/4表示順時(shí)針旋轉(zhuǎn)45度捡遍,CGFloat.pi/4代表旋轉(zhuǎn)的角度。

2.1 組合動(dòng)畫

有的人說了:我想同時(shí)變可以嗎竹握?當(dāng)然可以啦画株。要幾個(gè)動(dòng)畫一起來可以這樣寫:

let scale=CGAffineTransform(scaleX:0.6,y:0.6)//縮小到原來的0.6倍?

letrotation=CGAffineTransform(rotationAngle:CGFloat.pi/4)//順時(shí)針旋轉(zhuǎn)45度?

self.animView.transform=rotation.concatenating(scale)?

用concatenating()這個(gè)方法,你想套幾個(gè)動(dòng)畫都可以,比如還有一個(gè)平移動(dòng)畫可以這樣寫:

let transY=CGAffineTransform(translationX: 0, y: 150)//向下移動(dòng)150的距離?

letscale=CGAffineTransform(scaleX:0.6,y:0.6)//縮小到原來的0.6倍?

letrotation=CGAffineTransform(rotationAngle:CGFloat.pi/4)//順時(shí)針旋轉(zhuǎn)45度?

self.animView.transform=transY.concatenating(rotation.concatenating(scale))?

需要更多資料的人谓传,請(qǐng)聯(lián)系vx:1914532832蜈项,請(qǐng)備注:iOS開發(fā)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末续挟,一起剝皮案震驚了整個(gè)濱河市紧卒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌诗祸,老刑警劉巖跑芳,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異直颅,居然都是意外死亡博个,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門际乘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坡倔,“玉大人,你說我怎么就攤上這事脖含∽锼” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵养葵,是天一觀的道長(zhǎng)征堪。 經(jīng)常有香客問我,道長(zhǎng)关拒,這世上最難降的妖魔是什么佃蚜? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮着绊,結(jié)果婚禮上谐算,老公的妹妹穿的比我還像新娘。我一直安慰自己归露,他們只是感情好洲脂,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剧包,像睡著了一般恐锦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上疆液,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天一铅,我揣著相機(jī)與錄音,去河邊找鬼堕油。 笑死潘飘,一個(gè)胖子當(dāng)著我的面吹牛肮之,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卜录,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼局骤,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了暴凑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤赘来,失蹤者是張志新(化名)和其女友劉穎现喳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體犬辰,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嗦篱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了幌缝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灸促。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涵卵,靈堂內(nèi)的尸體忽然破棺而出浴栽,到底是詐尸還是另有隱情,我是刑警寧澤轿偎,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布典鸡,位于F島的核電站,受9級(jí)特大地震影響坏晦,放射性物質(zhì)發(fā)生泄漏萝玷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一昆婿、第九天 我趴在偏房一處隱蔽的房頂上張望球碉。 院中可真熱鬧,春花似錦仓蛆、人聲如沸睁冬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)痴突。三九已至,卻和暖如春狼荞,著一層夾襖步出監(jiān)牢的瞬間辽装,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工相味, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拾积,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像拓巧,于是被迫代替她去往敵國(guó)和親斯碌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 1 CALayer IOS SDK詳解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi閱讀 5,133評(píng)論 3 23
  • 1肛度、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,969評(píng)論 3 119
  • 日本相關(guān)的歷史知識(shí)鋪墊差不多了傻唾,終于可以說說旅游的事了。 日本文化之旅的首選城市肯定是京都承耿,而不是東京冠骄,今天就來說...
    8月的荷閱讀 951評(píng)論 0 4
  • 雨季嘩然,擾動(dòng)心房 百轉(zhuǎn)千腸加袋,會(huì)意平實(shí) 處夢(mèng)境般凛辣,回親切鄉(xiāng) 覓幸福點(diǎn),感生活實(shí) 平輕狂勁职烧,豐個(gè)性靈 悉心當(dāng)下扁誓,不縱光陰
    團(tuán)子姐姐喲閱讀 238評(píng)論 5 10
  • 本文參與#漫步青春#征文活動(dòng),作者洪蓓蓓蚀之,本人承諾蝗敢,文章內(nèi)容為原創(chuàng),且未在其他平臺(tái)發(fā)布 停下來享受美好 非洲莫...
    hhhbei閱讀 114評(píng)論 0 0