下面是范文網(wǎng)小編分享的iOS開發(fā)數(shù)據(jù)存儲(chǔ)NSCoder7篇(ios開發(fā)數(shù)據(jù)存儲(chǔ)),以供參考。

iOS開發(fā)數(shù)據(jù)存儲(chǔ)NSCoder1
時(shí)間過得真快,一眨眼我的實(shí)習(xí)生活就結(jié)束了,在這幾天內(nèi),我似乎過了半年,又似乎是一瞬間,又好像做了一個(gè)很長很長的夢(mèng),夢(mèng)醒的時(shí)候我就回到了我的學(xué)校。
三年時(shí)間,應(yīng)該說是或多或少有些收獲,可一走出校門后我才了發(fā)現(xiàn)我什么也不是,什么也不會(huì),所學(xué)的東西少得可憐,連九牛一毛也可以說都不知.
說真的,很有幸我進(jìn)入的是**家具實(shí)業(yè)有限公司進(jìn)行實(shí)習(xí),也可以說是試聘;在**信息中心進(jìn)行編程,是用delphi軟件給他們的一分廠的員工進(jìn)行效益工資和計(jì)件工資方面的核算,求出他們的總工資.最后能以報(bào)表的形式表現(xiàn)出來,在這方面他們同進(jìn)要求要個(gè)有查詢的功能,也說是說輸入工號(hào)可以調(diào)出一個(gè)員工三個(gè)月這內(nèi)的所有的工資,同時(shí)超出三個(gè)月的可以自動(dòng)消除.同時(shí)他們的工作流程是單卡流程,一個(gè)卡號(hào),批量的進(jìn)入,然后經(jīng)本文來源于文秘公文網(wǎng)過員工的加工操作之后,批量的輸出。在這個(gè)方面他們有個(gè)出材量和購進(jìn)量之比,也就是說如何去求他們的出材率,出材率越高,就意味著生產(chǎn)出來的好的產(chǎn)品就越多,員工的效益工資就越高。比如他們有四個(gè)產(chǎn)品:規(guī)格料、指接、拼板、集成材、他們會(huì)對(duì)這四個(gè)產(chǎn)品進(jìn)行定價(jià);如生產(chǎn)出一立方米規(guī)格料的價(jià)格是3300元、指接是3600元、拼板是4000元、而集成材則是4860元;通過這些定價(jià)我們可以很清楚的看出工廠要求員工生產(chǎn)出什么樣的產(chǎn)品。入他們的工序的材料我們稱之為毛料,而產(chǎn)出的東西我們又稱之為毛壞料,公司規(guī)定:如果員工的出材率在76.8%,那么超出的部分就是員工的效益工資,如果低于76.8%,那么員工就沒有效益工資,負(fù)數(shù)歸位于零,按零來計(jì)算,之后他要求對(duì)員工進(jìn)行效益工資分配,比如有四個(gè)工序,送料器,直邊、壓刨、四面刨、他們又給這些工序的員工進(jìn)行效益比例的分配、比如送料器是13.4%、直邊是9.6%、壓刨是50.4%、四面刨是30.6%,在這里又有主副之分,比例為6和4,同時(shí)他要求我們將效益工資進(jìn)行分配到員工,也就是說員工可以很清楚的要看到自己一天能掙多少錢,做到心中有數(shù),當(dāng)然這個(gè)簡(jiǎn)單,我們只須打印出報(bào)表就行了。
還有一點(diǎn)就是對(duì)計(jì)件工資進(jìn)行核算,在這方面他們也有一定的規(guī)格,比如長度,寬度,厚度在那個(gè)范圍內(nèi),就有不同的定價(jià);比如寬度小于20mm,定價(jià)是160元;如果在20mm和40mm之間,那么定價(jià)就可能在90元左右;如果大于40mm時(shí),那么就可能是60元了,進(jìn)行計(jì)價(jià)工資統(tǒng)計(jì)之后我們就可以進(jìn)行分配了,在這方面他們的比例也是不如,又會(huì)添加新的工序,如改料鋸了,還會(huì)有新的分配比例.
剛開始我們做這個(gè)程序的時(shí)候,大家都比較盲目,只是負(fù)責(zé)人說了一下,我們就開始進(jìn)行編了在這個(gè)過程之種我們吃了許多的苦,有時(shí)候凌晨三四點(diǎn)我們還在加班,可最后做出的作品是輸入速度太慢,我們的主管于是帶領(lǐng)我們到他們一樓的微機(jī)室是去看他們以前編寫的程序;不看不知道,一看嚇了我們一大跳,以前我們那有這樣想過呀,只要能做出來,沒有錯(cuò)誤就行了,可是速度呢?人家一個(gè)小時(shí)輸入的東西,我們的程序可能需要一個(gè)早晨,看完之后主管對(duì)我們說:這樣的程序送你,你會(huì)用嗎?
那個(gè)打擊呀,辛苦了幾天幾夜,最終卻是這樣的一個(gè)結(jié)果。可打擊歸打擊,我們又得重新來做!相對(duì)而言,我們這次要比以前有經(jīng)驗(yàn)了,一次比一次成熟起來了,在經(jīng)歷了又一個(gè)一天一夜的奮戰(zhàn),我們終于又有新希望了,可是心情剛好,那么又傳來了消息,說他們的分配比例又發(fā)生的變動(dòng),價(jià)格又有了新的調(diào)整,這在以前我們也想過這個(gè)問題,也想好好的做,可是我們又一想他們的工廠不是要實(shí)用嗎?這方面變化的可能性很小,于是為了方期間我將有變量寫進(jìn)了代碼之中,這一變,無易宣布我要破產(chǎn)。和我在一起的幾個(gè)也是這種情況,所以我們這些沒有開發(fā)過軟件的充當(dāng)軟件高手的新手們又得重新面對(duì)新的問題了.
失敗,又一次被打敗!
幾天之后我們又做出了程序,很辛苦,此時(shí)我們才明白程序員的不易了,編程是一個(gè)見效特別慢的東西,而且對(duì)方又看不見,如果一不小心你的程序可能會(huì)無法打開,或者是說出現(xiàn)別的什么,那就完了,你幾天的成果就什么也看不見了,本文自文秘公文網(wǎng)不像別的東西,做了,可以讓大家看得見。我的程序在最后的調(diào)試時(shí)出現(xiàn)了一點(diǎn)小故障,而且工資的分配要對(duì)應(yīng)到每一個(gè)員工,可我一時(shí)間一點(diǎn)思路也沒有了,就只能對(duì)應(yīng)到職務(wù),所以我失敗了,我的實(shí)習(xí)生活也就結(jié)束了。
當(dāng)然比表面來看我是失敗了,敗的很慘;可是從某種意義上說我又達(dá)到了我的目的,因?yàn)橹挥惺〉娜擞肋h(yuǎn)都不會(huì)停下思考的腳步,激起了我沉睡的思想,使我一顆盲目的心有了方向,我不能這樣輸了,從那兒倒下去的,我會(huì)從那兒站起來的,認(rèn)認(rèn)真真的把畢業(yè)設(shè)計(jì)拿下來了;別人實(shí)習(xí)了一個(gè)月我雖然只有十六天,可在這十六天中我從未停下來過,我是白天干,晚上干,頂著那么大的壓力,我的體會(huì)絕不低于他們中的任何一個(gè)人,說實(shí)話,在一段實(shí)習(xí)期間,我真的有點(diǎn)撐不住了,我也想到過放棄,也曾有好幾家單位通知我去面試,也有聯(lián)通的第二輪復(fù)試,可我都放棄了,我不能就這樣走了。我輸?shù)舻氖羌寄?,不是人?失掉了人格我將失去了所有,失掉技能我還會(huì)追回來的!
人生的每一步旅途中,總有著一道無形的欄桿,每一次跨越需要很多的勇氣,也不是每一次跨越都能夠成功,失敗是不可避免的,主要的是要敢于承認(rèn)失敗,面對(duì)失敗,努力去做,解決它,有這個(gè)決心,我想人生會(huì)成功的,至少可以無憾!這次我想我會(huì)很用心的去學(xué)習(xí),去做我的畢業(yè)設(shè)計(jì)!盡量把他做到完美,至少我自己要九十分的滿意我才會(huì)交出我的作品。
人生就是經(jīng)歷著風(fēng)風(fēng)雨雨,在風(fēng)雨中倒下去,然后站起來的時(shí)候,那時(shí)的彩虹最美麗!
四周的時(shí)間能夠和山大的同學(xué)一起工作、學(xué)習(xí)、生活我感到非常的榮幸,同時(shí)也感覺到很大的壓力,作為電子商務(wù)專業(yè)的學(xué)生從事軟件開發(fā)感覺還是有一定的困難,特別是我們還是和山大大三的學(xué)生一起,在初來時(shí)自己就有一些不自信,但隨著項(xiàng)目的進(jìn)展,我慢慢的找到了自己的位置,找到自己的目標(biāo),雖然自己與好的同學(xué)還有差距,這也給了我很大壓力,但是我相信沒有壓力就沒有動(dòng)力,所以整個(gè)實(shí)訓(xùn)過程中我都在不斷地努力。
實(shí)訓(xùn)期間讓我學(xué)到很多東西,不僅在理論上讓我對(duì)it領(lǐng)域有了全新的認(rèn)識(shí),在實(shí)踐能力上也得到了很大的提高,真正的學(xué)到了學(xué)以致用,更學(xué)到很多做人的道理,對(duì)我來說受益匪淺。特別是利用周六上午的時(shí)間山大為我們安排的講座讓我們了解it領(lǐng)域一些新的發(fā)展動(dòng)態(tài)以及一些領(lǐng)先的技術(shù),讓我意識(shí)到自己知識(shí)的缺少,這激勵(lì)我在以后的學(xué)習(xí)、工作、生活中要不斷了解信息技術(shù)發(fā)展動(dòng)態(tài)以及信息發(fā)展中出現(xiàn)的新的技術(shù)。
除此之外,我還學(xué)到了如何與人相處,如何和人跟好的交流,我們組成一個(gè)團(tuán)隊(duì)大家一起開發(fā)一個(gè)項(xiàng)目,大家的交流溝通顯得尤為重要,如何將自己的想法清楚明白的告訴隊(duì)友,如何提出自己想法的同時(shí)又不傷害其他的隊(duì)友的面子,這些在我的實(shí)訓(xùn)生活中都有一些體會(huì)??墒钦f,第一次親身體會(huì)理論與實(shí)際相結(jié)合,讓我大開眼界。也是對(duì)以前學(xué)習(xí)的一個(gè)初審吧,相信這次實(shí)訓(xùn)多我以后的學(xué)習(xí)、工作也將會(huì)有很很大的影響,在短短的二十幾天里這些寶貴的經(jīng)驗(yàn)將會(huì)成為我以后工作的基石。
iOS開發(fā)數(shù)據(jù)存儲(chǔ)NSCoder2
SQLite3是嵌入在iOS中的關(guān)系型數(shù)據(jù)庫,對(duì)于存儲(chǔ)大規(guī)模的數(shù)據(jù)很有效,SQLite3使得不必將每個(gè)對(duì)象都加到內(nèi)存中。
基本操作:
(1)打開或者創(chuàng)建數(shù)據(jù)庫
Sqlite3?*database;
intresult?=?sqlite3_open(“/path/databaseFile”,?&database);
如果/path/databaseFile不存在,則創(chuàng)建它,否則打開它。如果result的值是SQLITE_OK,則表明我們的操作成功。
注意上述語句中數(shù)據(jù)庫文件的地址字符串前面沒有@字符,它是一個(gè)C字符串。將NSString字符串轉(zhuǎn)成C字符串的方法是:
constchar*cString?=?[nsString?UTF8String];
(2)關(guān)閉數(shù)據(jù)庫
Sqlite3_close(database);
(3)創(chuàng)建一個(gè)表格
char*errorMsg;
constchar*createSQL?=“CREATE?TABLE?IF?NOT?EXISTS?PEOPLE?(ID?INTEGER?PRIMARY?KEY?AUTOINCREMENT,?FIELD_DATA?TEXT)”;
intresult?=?sqlite3_exec(database,?createSQL,?NULL,?NULL,?&errorMsg);
執(zhí)行之后,如果result的值是SQLITE_OK,則表明執(zhí)行成功;否則,錯(cuò)誤信息存儲(chǔ)在errorMsg中,
Sqlite3_exec這個(gè)方法可以執(zhí)行那些沒有返回結(jié)果的操作,例如創(chuàng)建、插入、刪除等。
(4)查詢操作
NSString?*query?=?@“SELECT?ID,?FIELD_DATA?FROM?FIELDS?ORDER?BY?ROW”
iOS開發(fā)數(shù)據(jù)存儲(chǔ)NSCoder3
iOS是目前最為流行、最熱門的操作系統(tǒng)之一,在全球有著不可替代的地位,雖然在中國,android的市場(chǎng)占有率與IOS想比較要高的多,但是IOS系統(tǒng)的蘋果手機(jī)在中國也屬于高端品牌。從品牌以及系統(tǒng)技術(shù)含量做人就要做一個(gè)徘徊在牛A和牛C之間的人。上來看,IOS就業(yè)崗位都屬于高端企業(yè)。而且基于IOS系統(tǒng)的app應(yīng)用程序開發(fā)更是行業(yè)的旗幟。但由于我國IOS開發(fā)起步較晚,人才培養(yǎng)體系還跟不上市場(chǎng)的發(fā)展速度,IOS開發(fā)人才都成為我國企業(yè)必爭(zhēng)的資源。在做人就要做一個(gè)徘徊在牛A和牛C之間的人。我們看來,目前很多企業(yè)都有收購的行為,其實(shí)被收購的公司并不是因?yàn)橛屑夹g(shù)秘方,也不是被收購的企業(yè)真的市值非常大,更不會(huì)因?yàn)槠放坪?,其?shí)收購就是在于人才的收購。
iOS人才缺口大:據(jù)相關(guān)數(shù)據(jù)顯示,目前我捐款就像發(fā)-情,一想起來馬上就要。國IOS軟件人才出現(xiàn)了接近四十萬的缺口,而且未來幾年呢IOS軟件開發(fā)人才缺口將過百萬。但是目前IOS最大的人才輸出地也就是培訓(xùn)機(jī)構(gòu),遠(yuǎn)遠(yuǎn)無法滿足,而大學(xué)有未開設(shè)IOS專業(yè),因此IOS人才欠缺將是持久問只要功夫深,拉屎也認(rèn)真啊!題。
iOS技術(shù)領(lǐng)先: 凡是IOS系統(tǒng)的智能設(shè)備,都屬于蘋果公司的終端設(shè)備,蘋果公司在品牌營造上本身就是高端品牌。再看IOS系統(tǒng)開發(fā)中的開發(fā)語言是objective Cc,單從objective C只要功夫深,拉屎也認(rèn)真啊!c來說,技能起點(diǎn)也相對(duì)較高,因此具有IOS平臺(tái)開發(fā)經(jīng)驗(yàn)的比其他的平臺(tái)開發(fā)經(jīng)驗(yàn)的技術(shù)水平要高很多。那么從IOS品牌的高端性和技術(shù)水平的要求來看都比同行業(yè)要高,自然在薪資待遇上也會(huì)相應(yīng)的高很多,有數(shù)據(jù)顯示工資就像例假,一月不來你就傻眼。,IOS開發(fā)從業(yè)者比同行其他平臺(tái)的開發(fā)從業(yè)者待遇要平均高到20%-30%左右。
我國IOS就業(yè)前景自然不用說,開發(fā)崗位也非常的多,就app應(yīng)用開發(fā)工程師、游戲開發(fā)工程師、測(cè)試工程師、UI設(shè)計(jì)師每個(gè)崗捐款就像發(fā)-情,一想起來馬上就要。位都有大量的欠缺,當(dāng)然人才只能從培訓(xùn)機(jī)構(gòu)中補(bǔ)給,但是人才補(bǔ)給相對(duì)較慢。因此只要具備IOS相關(guān)的技能,擁有一定的項(xiàng)目實(shí)戰(zhàn)經(jīng)驗(yàn)之后,前途無量。也正因?yàn)槠髽I(yè)及開發(fā)者看到了IOS的市場(chǎng)前景,大力推動(dòng)IOS開發(fā)談判就像口-交,費(fèi)盡了口舌也就那點(diǎn)收獲。行業(yè),也使得越來越多的學(xué)子們加入了IOS培訓(xùn)行業(yè),希望通過培訓(xùn),讓自己的發(fā)展起點(diǎn)更高。
[ios開發(fā)就業(yè)前景]
iOS開發(fā)數(shù)據(jù)存儲(chǔ)NSCoder4
1.“省電,流暢,優(yōu)質(zhì)應(yīng)用,響應(yīng)速度快,用戶體驗(yàn)好……”也許是眾多用戶眼中的蘋果系統(tǒng),
2.在眾手機(jī)商拼CPU主頻,拼4核,8核的年代,蘋果依然堅(jiān)持雙核,iphone用戶體驗(yàn)仍然堅(jiān)挺。
以上兩點(diǎn)IOS是如何優(yōu)化,在續(xù)航,流暢度和響應(yīng)速度上完勝安卓,答案就是多線程&RunLoop...
RunLoop是IOS事件響應(yīng)與任務(wù)處理最核心機(jī)制,它貫穿IOS整個(gè)系統(tǒng)運(yùn)作,
RunLoop不像一般的線程循環(huán)等待任務(wù),傳統(tǒng)的線程循環(huán)等待任務(wù)會(huì)導(dǎo)致CPU時(shí)間被占用,雖然你設(shè)置了睡眠時(shí)間,但很多時(shí)候會(huì)出現(xiàn)空轉(zhuǎn),
而RunLoop是監(jiān)控事件觸發(fā)處理機(jī)制,說白了,在有事件的時(shí)候CPU全力生產(chǎn),當(dāng)沒有事件產(chǎn)生的時(shí)候,線程就掛起等待事件。
可以說,RunLoop是IOS比android省電,流暢,用戶體驗(yàn)好的主要原因。
iOS開發(fā)數(shù)據(jù)存儲(chǔ)NSCoder5
繪圖操作
前言:在iOS開發(fā)中,系統(tǒng)已經(jīng)給我們提供了功能強(qiáng)大的控件,可是很多并不能滿足我們的需求,這時(shí)候我們需要,自定義一些美觀的控件。所用的知識(shí)也就是下面的繪圖。
1.基本的繪圖知識(shí)
1.1圖形上下文
1.1圖形上下文(Graphics Context):是一個(gè)CGContextRef類型的數(shù)據(jù)
1.2圖形上下文的作用
保存繪圖信息、繪圖狀態(tài)
決定繪制的輸出目標(biāo)(繪制到什么地方去?)
(輸出目標(biāo)可以是PDF文件、Bitmap或者顯示器的窗口上)
1.2 - (void)drawRect:(CGRect)rect
作用:就是用來繪圖 什么調(diào)用:當(dāng)控件第一次顯示的時(shí)候 rect:當(dāng)前控件的bounds1.2 繪圖的步驟
1.獲得圖形上下文:
cGContextRef ctx = UIGraphicsGetCurrentContext();
2.拼接路徑
新建一個(gè)起點(diǎn)
void CGContextMoveToPoint(CGContextRef c, CGFloat x, CGFloat y)
添加新的線段到某個(gè)點(diǎn)
void CGContextAddLineToPoint(CGContextRef c, CGFloat x, CGFloat y)
添加一個(gè)矩形
void CGContextAddRect(CGContextRef c, CGRect rect)
添加一個(gè)橢圓
void CGContextAddEllipseInRect(CGContextRef context, CGRect rect)
添加一個(gè)圓弧
void CGContextAddArc(CGContextRef c, CGFloat x, CGFloat y,
cGFloat radius, CGFloat startAngle, CGFloat endAngle, int clockwise)
3.添加路徑到上下文
Mode參數(shù)決定繪制的模式
void CGContextDrawPath(CGContextRef c, CGPathDrawingMode mode)
繪制空心路徑
void CGContextStrokePath(CGContextRef c)
繪制實(shí)心路徑
void CGContextFillPath(CGContextRef c)
提示:一般以CGContextDraw、CGContextStroke、CGContextFill開頭的函數(shù),都是用來繪制路徑的
4.渲染到View上面
1.3 基本的繪圖實(shí)例
1. 繪制線條
獲得圖形上下文:UIGraphicsGetCurrentContext()拼接路徑:UIBezierPath添加路徑到上下文CGContextAddPath(ctx, path.CGPath)渲染到View上面CGContextStrokePath(ctx)- (void)drawLine{ // 一個(gè)路徑對(duì)象,可以對(duì)應(yīng)多跟線 // 1.獲取跟當(dāng)前view想關(guān)聯(lián)的上下文,系統(tǒng)自動(dòng)幫我們創(chuàng)建的上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 設(shè)置上下文的狀態(tài),應(yīng)該放在渲染之前就可以 // 創(chuàng)建對(duì)應(yīng)顏色對(duì)象,調(diào)用set方法 [[UIColor redColor] set]; // 設(shè)置上下文的線寬 CGContextSetLineWidth(ctx, 15); // 設(shè)置線段的連接樣式 CGContextSetLineJoin(ctx, kCGLineJoinRound); // 設(shè)置線段的端點(diǎn)樣式 CGContextSetLineCap(ctx, kCGLineCapRound); // 2.拼接路徑,UIBezierPath,封裝好了一套很好使用的路徑 UIBezierPath *path = [UIBezierPath bezierPath]; // 2.1 設(shè)置起點(diǎn) [path moveToPoint:CGPointMake(10, 125)]; // 2.2 添加一根線到某個(gè)點(diǎn) [path addLineToPoint:CGPointMake(220, 125)]; // 如果只使用一根路徑,默認(rèn)下一根線的起點(diǎn)在上一根跟線終點(diǎn) [path addLineToPoint:CGPointMake(200, 150)]; // 3.添加路徑到上下文 CGContextAddPath(ctx, path.CGPath); // 4.渲染到view上面的圖層 CGContextStrokePath(ctx);}
2.繪制曲線
一般通過貝塞爾曲線來繪制圖形:UIBezierPath
-(void)drawLIneQuadCurve{ // 1.獲取上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 2.拼接路徑 UIBezierPath *path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(10, 125)]; [path addQuadCurveToPoint:CGPointMake(240, 125) controlPoint:CGPointMake(125, 0)]; // 3.路徑添加到上下文 CGContextAddPath(ctx, path.CGPath); // 4.渲染上下文 //以填充的方式渲染 //CGContextFillPath(ctx); CGContextStrokePath(ctx);}
3.繪制矩形
// 繪制矩形- (void)drawRect{ CGContextRef ctx = UIGraphicsGetCurrentContext(); UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(50, 50, 100, 100) cornerRadius:50]; CGContextAddPath(ctx, path.CGPath); // 設(shè)置填充的顏色 [[UIColor redColor] setFill]; [[UIColor greenColor] setStroke]; // 填充:必須封閉的路徑 // 即描邊又填充 // 如果以后只需要描邊,最好不要使用fill CGContextDrawPath(ctx, kCGPathFillStroke); // CGContextFillPath(ctx); CGContextStrokePath(ctx);}
4.繪制圓弧
- (void)drawRect:(CGRect)rect { // 畫圓弧 // center:圓心 // radius:半徑 // clockwise:當(dāng)前是 yes:順時(shí)針 no:逆時(shí)針 CGPoint center = CGPointMake(125, 125); UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(125, 125) radius:100 startAngle:0 endAngle:-M_PI_2 clockwise:NO]; // 添加一根線到圓心 [path addLineToPoint:center]; // 關(guān)閉路徑:從路徑的終點(diǎn)到起點(diǎn) // [path closePath]; // 填充,默認(rèn)會(huì)關(guān)閉路徑,從路徑的終點(diǎn)到起點(diǎn) [path fill];}
5.繪制文字
- (void)drawRect:(CGRect)rect{ //=========================繪制文字========================== NSString *name = @會(huì)長桂雛菊; // 描述文字的屬性,顏色,字體大小 NSMutableDictionary *attr = [NSMutableDictionary dictionary]; // 字體 attr[NSFontAttributeName] = [UIFont systemFontOfSize:15]; // 顏色 attr[NSForegroundColorAttributeName] = [UIColor redColor]; // 邊框顏色 attr[NSStrokeColorAttributeName] = [UIColor redColor]; // 邊框?qū)挾? attr[NSStrokeWidthAttributeName] = @1; // 陰影 NSShadow *shadow = [[NSShadow alloc] init]; shadow.shadowOffset = CGSizeMake(3, 3); shadow.shadowColor = [UIColor yellowColor]; shadow.shadowBlurRadius = 3; attr[NSShadowAttributeName] = shadow; [name drawInRect:CGRectMake(90, 100, 100, 50) withAttributes:attr];}
6.繪制餅狀圖
在初始化的時(shí)候時(shí)候,系統(tǒng)通過調(diào)用drawRect方法繪圖。但是如果我們要重繪,手動(dòng)調(diào)用drawRect方法是無效的。不過系統(tǒng)為我們準(zhǔn)備了重繪的方法:
重繪:setNeedsDisplay
- (void)drawRect:(CGRect)rect { // Drawing code NSArray *datas = @[@25,@25,@50]; CGPoint center = CGPointMake(125, 125); CGFloat r = 100; CGFloat startA = 0; CGFloat angle = 0; CGFloat endA = 0; for (NSNumber *number in datas) { // 遍歷一個(gè)數(shù)據(jù),繪制一根扇形 startA = endA; angle = number.intValue / 100.0 * M_PI * 2; endA = startA + angle; // 描述圓弧 UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:r startAngle:startA endAngle:endA clockwise:YES]; [path addLineToPoint:center]; [[self randomColor] set]; [path fill]; }}//當(dāng)點(diǎn)擊View的時(shí)候,重繪- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [self setNeedsDisplay];}//生成隨機(jī)的顏色- (UIColor *)randomColor{ CGFloat r = arc4random_uniform(256) / 255.0; CGFloat g = arc4random_uniform(256) / 255.0; CGFloat b = arc4random_uniform(256) / 255.0; return [UIColor colorWithRed:r green:g blue:b alpha:1];}
7.上下文棧
將當(dāng)前的上下文copy一份,保存到棧頂(那個(gè)棧叫做”圖形上下文棧”):
void CGContextSaveGState(CGContextRef c)
將棧頂?shù)纳舷挛某鰲?替換掉當(dāng)前的上下文:
void CGContextRestoreGState(CGContextRef c)
- (void)drawRect:(CGRect)rect { // Drawing code // 1.獲取上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 2.拼接路徑 UIBezierPath *path = [UIBezierPath bezierPath]; // 橫 [path moveToPoint:CGPointMake(10, 150)]; [path addLineToPoint:CGPointMake(290, 150)]; // 3.把路徑添加到上下文 CGContextAddPath(ctx, path.CGPath); //================================================ // 保存上下文狀態(tài) CGContextSaveGState(ctx); //================================================ // 設(shè)置上下文的狀態(tài) CGContextSetLineWidth(ctx, 10); [[UIColor redColor] set]; // 4.渲染上下文,查看上下文的狀態(tài),根據(jù)狀態(tài)去渲染 CGContextStrokePath(ctx); // 豎 path = [UIBezierPath bezierPath]; [path moveToPoint:CGPointMake(150, 10)]; [path addLineToPoint:CGPointMake(150, 290)]; // 3.把路徑添加到上下文 CGContextAddPath(ctx, path.CGPath); // ============================================== // 從上下文狀態(tài)棧里面取出保存的狀態(tài),替換掉當(dāng)前的狀態(tài) CGContextRestoreGState(ctx); // ============================================= // 4.渲染上下文,查看上下文的狀態(tài),根據(jù)狀態(tài)去渲染 CGContextStrokePath(ctx);}
8.上下文的平移,旋轉(zhuǎn),縮放
利用矩陣操作,能讓繪制到上下文中的所有路徑一起發(fā)生變化
縮放
void CGContextScaleCTM(CGContextRef c, CGFloat sx, CGFloat sy)
旋轉(zhuǎn)
void CGContextRotateCTM(CGContextRef c, CGFloat angle)
平移
void CGContextTranslateCTM(CGContextRef c, CGFloat tx, CGFloat ty)
- (void)drawRect:(CGRect)rect { // 獲取上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 拼接路徑 UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(-100, -50, 200, 100)]; // 矩陣操作:必須要在添加路徑之前進(jìn)行形變 // 平移上下文 CGContextTranslateCTM(ctx, 100, 100); // 旋轉(zhuǎn) CGContextRotateCTM(ctx, M_PI_4); // 縮放 CGContextScaleCTM(ctx, 0.5, 0.5); // 添加路徑到上下文 CGContextAddPath(ctx, path.CGPath); // 渲染上下文 CGContextFillPath(ctx);}
9.圖片加水印
1.開啟一個(gè)基于位圖的圖形上下文
void UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale)
size:上下文尺寸 opaque:不透明 Yes 不透明 透明 NO scale:是否縮放上下文,0表示不要縮放2.從上下文中取得圖片(UIImage):
UIImage* UIGraphicsGetImageFromCurrentImageContext()
3.結(jié)束基于位圖的圖形上下文:
void UIGraphicsEndImageContext()
- (void)viewDidLoad {開啟一個(gè)基于位圖的圖形上下文void UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale) [super viewDidLoad]; UIImage *image = [UIImage imageNamed:@hina]; // 創(chuàng)建位圖上下文 UIGraphicsBeginImageContextWithOptions(image.size, NO, 0); [image drawAtPoint:CGPointZero]; // 文字 NSString *str = @會(huì)長桂雛菊; [str drawAtPoint:CGPointMake(0, 0) withAttributes:nil]; // 根據(jù)上下文的內(nèi)容生成一張圖片 image = UIGraphicsGetImageFromCurrentImageContext(); // 關(guān)閉上下文 UIGraphicsEndImageContext(); // 用來網(wǎng)絡(luò)中傳輸圖片 NSData *data = UIImagePNGRepresentation(image); [data writeToFile:@/Users/apple/Desktop/image.png atomically:YES];}
10.圖片裁剪
1.將當(dāng)前上下所繪制的路徑裁剪出來(超出這個(gè)裁剪區(qū)域的都不能顯示):
void CGContextClip(CGContextRef c)
思路分析
先畫一個(gè)大圓,在設(shè)置裁剪區(qū)域,把圖片畫上去,超出裁剪區(qū)域的自動(dòng)裁剪掉,
* 加載舊圖片,根據(jù)舊圖片,獲取上下文尺寸。
* 確定圓環(huán)寬度 borderW
* 上下文的尺寸 = 新圖片的尺寸
* 確定新的上下文尺寸: newImageW : oldImageW + 2 * borderW newImageH : oldImageH + 2 * borderW,
* 繪制大圓:
1.獲取上下文 2.添加路徑到上下文 3.設(shè)置大圓的顏色 = 圓環(huán)的顏色 4.渲染
* 設(shè)置裁剪區(qū)域,和圖片尺寸一樣大,只不過,x,y不一樣,x=borderW,y=borderW.
* 繪制舊圖片
* 獲取新圖片
* 關(guān)閉上下文
* 抽分類,3個(gè)參數(shù),圖片名稱,圓環(huán)寬度,圓環(huán)顏色
+ (UIImage*)imageCircleWithImage:(UIImage *)image borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor{ // 設(shè)置圓環(huán)寬度 CGFloat boardW = borderWidth; CGFloat imageW = image.size.width + 2 * boardW; CGFloat imageH = image.size.height + 2 *boardW; // 只有正方形才能正切圓,選擇一個(gè)最短的尺寸,正切。 CGFloat circleW = imageW > imageH ? imageH : imageW; CGRect rect = CGRectMake(0, 0, circleW, circleW); // 2.開啟圖像上下文 UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0); // 3。獲取當(dāng)前上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 4.畫外圓 UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:rect]; CGContextAddPath(ctx, path.CGPath); [borderColor set]; CGContextFillPath(ctx); // 設(shè)置頭像尺寸 rect = CGRectMake(boardW, boardW, image.size.width , image.size.height); // 5.創(chuàng)建裁剪路徑 UIBezierPath *clipPath = [UIBezierPath bezierPathWithOvalInRect:rect]; // 6.裁剪路徑 // 根據(jù)這個(gè)路徑進(jìn)行裁剪,超出路徑以外的部分就不會(huì)顯示了 [clipPath addClip]; // 7.畫頭像 [image drawInRect:rect]; // 不能直接在這返回,上下文沒有關(guān)閉,會(huì)消耗內(nèi)存. // 8.獲取新圖片 image = UIGraphicsGetImageFromCurrentImageContext(); // 9.關(guān)閉上下文 UIGraphicsEndImageContext(); return image;}
11.截取屏幕
view之所以能顯示東西,完全是因?yàn)樗鼉?nèi)部的layer。View內(nèi)部有個(gè)layer(圖層)屬性,drawRect:方法中取得的是一個(gè)Layer Graphics Context,因此,繪制的東西其實(shí)是繪制到view的layer上去了
- (void)renderInContext:(CGContextRef)ctx;
//截取屏幕+ (UIImage*)imageWithCaptureView:(UIView*)captureView;{ // 1.開啟上下文 UIGraphicsBeginImageContextWithOptions(captureView.bounds.size, NO, 0.0); // 2.獲取當(dāng)前上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 3.把控制器圖層渲染到上下文 [captureView.layer renderInContext:ctx]; // 4.取出新圖片 UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage;}
iOS開發(fā)數(shù)據(jù)存儲(chǔ)NSCoder6
cocoaPods 是開發(fā) OS X 和 iOS 應(yīng)用程序的第三方庫的依賴管理工具,如果是正常的開發(fā)不需要使用的第三方的代碼,CocoaPods是不需要的,但是從實(shí)際情況上,為了提高開發(fā)效率,CocoaPods算是一個(gè)必備的開發(fā)工具之一,一般如果是簡(jiǎn)單的引用,CocoaPods的優(yōu)勢(shì)不是很明顯,當(dāng)項(xiàng)目用到的第三方應(yīng)用程序越來越多的時(shí)候,CocoaPods可以根據(jù)定義的依賴關(guān)系,統(tǒng)一管理,第三開源庫如果有更新,直接更新Pods文件即可。
cocoaPods基礎(chǔ)
cocoaPods是用 Ruby 寫的,并由若干個(gè) Ruby 包 (gems) 構(gòu)成的,所以有的時(shí)候我們會(huì)看到有人說CocoaPods利用依賴管理構(gòu)建的依賴管理工具,CocoaPods中用到了Ruby管理工作的包(gem),
cocoaPods應(yīng)該是iOS最常用最有名的類庫管理工具了,絕大部分有名的開源類庫,都支持CocoaPods。CocoaPods是用Ruby實(shí)現(xiàn)的,要想使用它首先需要有Ruby的環(huán)境。OS X系統(tǒng)默認(rèn)的已經(jīng)可以運(yùn)行Ruby了,如果安裝CocoaPods只需要在終端中輸入一個(gè)命令:
Sudo gem install cocoapods
cocoaPods是以Ruby gem包的形式被安裝的,安裝的時(shí)候大概需要十分鐘左右,需要FQ,如果不FQ的花可以通過淘寶的Ruby鏡像訪問CocoaPods。如果gem包版本不夠新,可以更新一下gem:
gem update
如果需要升級(jí)CocoaPods可以使用安裝的時(shí)候的同樣的命令:
Sudo gem install cocoapods
iOS開發(fā)數(shù)據(jù)存儲(chǔ)NSCoder7
Android系統(tǒng)一共提供了四種數(shù)據(jù)存儲(chǔ)方式,分別是:SharePreference、SQLite、Content Provider和File。由于Android系統(tǒng)中,數(shù)據(jù)基本都是私有的的,都是存放于“data/data/程序包名”目錄下,所以要實(shí)現(xiàn)數(shù)據(jù)共享,正確方式是使用Content Provider。
SQLite: SQLite是一個(gè)輕量級(jí)的數(shù)據(jù)庫,支持基本SQL語法,是常被采用的一種數(shù)據(jù)存儲(chǔ)方式。Android為此數(shù)據(jù)庫提供了一個(gè)名為SQLiteDatabase的類,封裝了一些操作數(shù)據(jù)庫的API。
SharedPreference: 除SQLite數(shù)據(jù)庫外,另一種常用的數(shù)據(jù)存儲(chǔ)方式,其本質(zhì)就是一個(gè)xml文件,常用于存儲(chǔ)較簡(jiǎn)單的參數(shù)設(shè)置。
File: 即常說的文件(I/O)存儲(chǔ)方法,常用語存儲(chǔ)大數(shù)量的數(shù)據(jù),但是缺點(diǎn)是更新數(shù)據(jù)將是一件困難的事情。
contentProvider: Android系統(tǒng)中能實(shí)現(xiàn)所有應(yīng)用程序共享的一種數(shù)據(jù)存儲(chǔ)方式,由于數(shù)據(jù)通常在各應(yīng)用間的是互相私密的,所以此存儲(chǔ)方式較少使用,但是其又是必不可少的一種存儲(chǔ)方式。例如音頻,視頻,圖片和通訊錄,一般都可以采用此種方式進(jìn)行存儲(chǔ)。每個(gè)Content Provider都會(huì)對(duì)外提供一個(gè)公共的URI(包裝成Uri對(duì)象),如果應(yīng)用程序有數(shù)據(jù)需要共享時(shí),就需要使用Content Provider為這些數(shù)據(jù)定義一個(gè)URI,然后其他的應(yīng)用程序就通過Content Provider傳入這個(gè)URI來對(duì)數(shù)據(jù)進(jìn)行操作,
PS: URI由3個(gè)部分組成:“ 空值
iNTEGER: 整數(shù)
REAL: 浮點(diǎn)數(shù)
TEXT: 字符串
BLOB: 大數(shù)據(jù)
在SQLite中,并沒有專門設(shè)計(jì)BOOLEAN和DATE類型,因?yàn)锽OOLEAN型可以用INTEGER的0和1代替true和false,而DATE類型則可以擁有特定格式的TEXT、REAL和INTEGER的值來代替顯示,為了能方便的操作DATE類型,SQLite提供了一組函數(shù),詳見:www.sqlite.org/lang_datefunc.html。這樣簡(jiǎn)單的數(shù)據(jù)類型設(shè)計(jì)更加符合嵌入式設(shè)備的要求。關(guān)于SQLite的更多資料,請(qǐng)參看:www.sqlite.org/
在Android系統(tǒng)中提供了android.database.sqlite包,用于進(jìn)行SQLite數(shù)據(jù)庫的增、刪、改、查工作。其主要方法如下:
BeginTransaction: 開始一個(gè)事務(wù)。
close(): 關(guān)閉連接,釋放資源。
delete(String table, String whereClause, String[] whereArgs): 根據(jù)給定條件,刪除符合條件的記錄。
iOS開發(fā)數(shù)據(jù)存儲(chǔ)NSCoder7篇(ios開發(fā)數(shù)據(jù)存儲(chǔ))相關(guān)文章: