From e145af50d6f7fc104855d01811a7154158d68ed1 Mon Sep 17 00:00:00 2001 From: nelanelanela Date: Tue, 14 Oct 2014 11:53:38 +0100 Subject: [PATCH] Check if device has camera. Pass the resulting video URL to a bloc. --- .../UserInterfaceState.xcuserstate | Bin 43116 -> 42155 bytes camera/CameraManager.swift | 95 ++++++++++-------- camera/ViewController.swift | 18 +--- 3 files changed, 56 insertions(+), 57 deletions(-) diff --git a/camera.xcodeproj/project.xcworkspace/xcuserdata/nataliaterlecka.xcuserdatad/UserInterfaceState.xcuserstate b/camera.xcodeproj/project.xcworkspace/xcuserdata/nataliaterlecka.xcuserdatad/UserInterfaceState.xcuserstate index 3666d4bf9369a64232279b995702802a1d667c2a..1b8723c52f3b7f8f65fa98985aa9917aa04d6a9d 100644 GIT binary patch delta 15721 zcmaia2V7J~)bGyRw)fImVCgJ<=~Z_Zr1z>c0Ria>DjmcE?!9yrj5=!U3icR#?iN2TbeenD3?m2U2=FH50&YU@Oo}7lOj>0Jh7^y~0HF5yt)R4cF z+rbX76YK)}z%90U_!DolfUFdr7cLRbvP!#Y?GCqN}+ zA*X~5un~R-r@*Oj8bok9oB?OTMX(DlhpRy*Tmv`2EpP|i33tPv;6eB^JPuF5lkhye z46ni8;9YnR-iOcO3-~wuglS`@m>Fh{Szxx9Gv&pd4;@2-XL$2cgY9jVuDybT33^ksbKyg$P)k;mII;klXqGnRFsd>~ws+(F$ zt)P^vs5R7jY7@1U+ClB6_EA4khpD5~aq1LxmbyS)rhcWaQ@5z!sr%F;>M8YtdQH8h z{-QompM_9J2!%p5p{7trs3#N)jfG}HiO^bTCv*@x3*CgC!hS-z&{ya$3=)P4BZSey zIN=~+l5nsvU6?7%7Ul^Hg+)r?NMWh4LRc-V6^;|u3t3^KutnG|>=1q@oF<$hoF$wq zTp;WcE)gyl{vcc}TqoQp+#=jA+$G#AJRm$I{8@NRcv5&qcwTr(cvbkD@TTyN@SgCY z@QLub@Rjfn;XC1b;U^lbM$vKqNmfd=-KpqdI8-{ zFQ%8%E9g!1W_k;~mHvr7NFSmP(`V^(^m+OweT%+L-=Uw=FX)%_EBYP%f&R#7C>b3_ z%$P8yj5FiHxH4{xJLAE4GG0u7W&q>I1Tvva1QWvyWKx*HOe#~tlrm*ZIa9$@GF419 zQ^SmAYMC+2SY{kEo@r)Um{z8ZnZnFr<}&k``OE@lA+w12fmy};$gF0zGTWH#%ns%t zbBH<2{KA}M%&s#xn48Qk<~DPOxz9Xe9y3pvr_4*{qZ&|ysEP~#v1lXN3}QAasP6%d z*mtx3r+JAga2sqzWC- z?~fexrOLAcMxX|EgS}l~56iOL;QZW@!phvUf^tCxH~@aij8BTIsm{$CRhU#*y_n}5 z6jZ0gC-KBk_c5|zg|b|CFVBM9T=#5kz47DSoh9z|&XVz86m_q!KPRAjdiWWf6-ZZt zqk=AQ3>*h1z)5floCfkUY%|-BZDCv4HnyFe$WCHARtoIFd2j(-S~%pOM$c-T0jXqpIv}5O}jE2ptnH!19XH=&>6ZwSLg=a zp$GJYUThcJ%`Rq_uuIux>~eMmyORCk2Z2584`l*tL4Y6t`oaOw5Bl>{yo$ZbW5|d# z;(!$g`f;E?2mDc**#)f_7{^Z(jAei9g7NHXG{D@`FA*lIcuDM^gQmyJ0aL%J-JTZsdEoj8>T!Bn*Q^U2r(Ni9OXxS!*(8wycx2oU(KUF`ne*9D&>uYUm59_3g_4Sq&aBx?*fD=@ogM0Ws z_riT}KM2SuD9f)Y;X6)Aj7_gDE-9?4&Mhft&#-5ayKOqsv?5Ip!Na@~p@Wk{zlg?` z<>yuxmz8$IBgoy#knXVv@F@HRtuS)IjtQ#yZzmBC%IvDb>YDP99231@yvSP=UbSv`smHkRKYO+w zyrP1{RrU&dinn9`S{DxwnVh$Ss(s%FmFw`9Y8Tw#LHR5DW499ChIiO&>~E|zE2*5{ zFoVjf_+3+0YUTfV_nf{;58z`}rH4Ffud{2q;S>0jy}|y;O4EZzRToy4=2jQ>iN1t? z{67GG%P+w@_9njsf3P;a3cnZRb-@qpE#<#P;xk75?;yr#jKNe88G~u^AimAsV_)}x z_zf%lq5`Ia8T=QLF)?N+u*ZzqJM8Z~lJD{+C20FJ8x!TfaK$8;C7ciV?ajVq@AFU< zutq)lVs@}-31*K;F$c_%eZW3sAF%z%i|m2Mt6u#Q z`T4|>*tckht)(&*%lN<70Lv5vU_;q=DkCNNvItl%j~XnG{p%k?f)!#V|Jxd1rC1qO zj#XflSQS>y{>{GUfG!8jIH1n~a}HRrXsBI(|1p?Spt}qki;cs^V|7?PHi7-Xeq=wf zpE)4l09b~x7{}{00c*mVIRH6;t8@b#AUGgI7wyi-Cacu@jsqBbYKVtogv*#@m*nca z)PllcxizDz`&N58Hd8foGdMtYVc&CrLf7rx+~#3j0_hTLKDGc`h%Mp(%>jl3Y8+5s zf^}nyu_f424rp*dlLJ~D&_M&FwaPWB{?>9po9{0;eTa*f+@;#Rvag?w81F$WTEt4f zGH=*cY@5owVLLfs!U2)WxN*R^cS&~h1`gYU?Zx(SK#v1r4jBG}7=H2&!XJC4%s^$- zwD>b1v(&Y!x~y_+URiEsfj0JEK1ghT-N7EHrto*{E_M&Q&jD)= z*l@s>19nTWhu9;y3VXrG_s3|yN7?qB>2 zTqMZr#`SO>ZXO))`p1CahPcVs4gvN%&V!QI+Ee8`G<@Sc;Fh?}H?nteyPn~B_sHg` z91UfkPl7w*PQ6S21q-+GF!1HSGJ_rv`;px}TH zYm?5qDq#i1{K8uYwvYMR!HL8}@bGV{Mc|Pf7{CEPm5-y<=dKPftmIvsTT3gLJ*p3{4Pb0C}pK`MlQv59yg4{&@KJ{&LNKrjbFI1u^|zjPeKT!5m&yk5Y z<1N|R_WV>KZJ_}glmlYItA;{eM6 zB?l&OaQc^NF}3w4c&}kG5kLeIK^)*X(7=Jl#Y6}ZN`!Hsi380XXhHk?XD7y~I^l8H z`VVM{1R{-}OCpg-B9e&|Vla`)fi@1bb6_F|CUKyH1D(r=bYh6=y2J0&RUDYiLBwxW z)&DQ3Qg%%_T#&a`2jD~zQA~^=MiQfl5~7qSBg%;iqLQd0s)-t6G*L^8A;uEpi19=n zQBO=Dlmts~L<7-CG!e~23(-on5$(i8ViM6obP|(^?}#bHRAL%|i0Q-(VkYrDF^iZ@ z%pv9y^N9Jx0%9Sti0C4^iNzc9WHPu~L4LAX3vJ6%GIfF{nNe)S&uxr6b@ z*k1}Jpb&pMz@ZWRXA_$0?+IGbL4PMO5xw9`JCRX9KQILi3>W|q>Im=#GtvHlI4~P& z1^R+{C?+rfEJTw6JwZ3x6Q}@7(YrtoumU*-xr0?GBgh7ip!C`ba*a;j( zIw2BB9!Fjwwvar9hJ<)P@+|69Q5Vpr5O+vkM)yK&Ao(j&4|Rj&b>tUn56N3-Sg02y ze@D+kO?Bgg;==m$xUbT~6fFuBqnn}XkbJ~T*i+$-mIgVGfY|fL@33y?jQ}a0!4YDqH~w)EMr}`+e)eU4a_9!T;7o z>JiqwXXYN^1@ursgcT5@)(A^rj8;ZC05fzh!Ujmty9ifcjqD>mfgKtWX$>6Egh+ll z(GQWKyif8x(iM0j^C&0K4@F1W068j)vID+oW|S*`LqEj-4nj}((okd=?F1rFXtXDY zMzzttAP#Mewg-dIuhA}Kl4_7<=w`H7Z%|@bcvRY#F;at71x_e8)&LERF$3wSB*qnF zqIofnWVWivSXHDE9u?a+jZ_|b9^*?EstT=p>V?PZgCd@3g4E*}#KjtrBl`-C(3V(T zP>PPm+Jg%8GS&rDBa1jMP>Yh{yvcDYF)MVE?|X5a9;ip#;+z4C?#9{j@h-J^4}RbK z#e0EvR1x0~bfD$&j^I0VHr^XdL)1V|Fa!AvbOW={h=J~4E}A>g87x3Q4~zm`NOw>a zSb{PKd4uI>>L3aD0c{u*09K<{gFL`GbR)qC`6cLrjc8DUC)k44Cs=5GJ1N_Fo(tH; zOFDtQNG;KoJfKoFU|Oma4NtTn5B)=J;;EliR6mrHVuwB_8c@_R6&=_^2PauV>Lfaq zX@J~Q^wE?geTq7xDh}=`KAU7sQRn{^w@S98s7wErmnZY(S57~Vsi7iWdPsS?0nkPR(<6Y0SIGdaOVdQkG)kPD z7!{EiG$=CZ3nGOEsyh7qr18_4ZbKUNkrpU&h!bh5B4s@-&Ke>iEmUN0f4>dUC$0KQ z?T~qf5wQJ7VZJAnpJ6~sRRa9v@#-$f5RpzQ(yxcSm|@5J>=lCzQ29_b^dgf$C7Ei- zHPevvPzkAqXoQ|-3VF5>@a6|%&QoHvD^nN9_-=xL57NmRPWq{Y6+OakS-NOtmH`Mv z`?4ZI2(m0zwQY!GL#@bgl^Bl^zRfX1-N+~v>Hmc^K-Y$f`H1nrbOXd>dw_vxK=x2F zvA4#VB15z-+a09zEZWUHil_9DagH{brVm%ur}WSjO9CV?`abhNXR;sKvIte83p!0$=7m6*?BaQ3?tEj0ug9H$BPt5 ztI&jOR*5F}h)RZOqRK*J(8g<&PEP9U-J7pv1}5{MHb6J?Y|+?ZA}|$o4ofGet3(2O z>kii=zwc|RSKspCcH|rtE0>pWL&t{ukn>e!RuAb@)E_KD6-7h9VqTYIu#8`%LF7u6 zKsYbZ+r;W(L+~SC;ENWGAP_l1n_R0BP<7eAhm|@)gWRBEsb)jPG9WkqD-k%7LVt}= z1KWC<2pp+T?o<^9^RlLB`zUSHI?|ln(f zDCOykeew?I*HRiyDwROt6|}mvfD&Ho6ZJ;1WpxB2C@L?=rP zrj;8*;az^PDoO+GE73+n%5|Xd0V*ly+j^|3o5I(%N1x04QNm|m)5fT-!UPIm@;I_Y zlgn+#E^!nq6Fkx>xv%MIFTkQ(x-=v9IXe;QP${i(o)6r?qOaUtx4Lb$bLPfQLPrR zM-H_iz!8iA`WRjy)!tuOtlxT4Hz{Hq7rOH%%Uo=Q5MQ%zH-cgNFM)8j7 z45c6MsGd{$X^s2xbi+SK(e?BMWWibyN}A=v&lao%4P(s{8|XIv%1AfTO>{HeLbq~o zCI@G6a1ICOad5#>x}Ba#Pog{MP7W^O;1Uk5;CQbeuKnh6Mo;UxoWbu^NK{3Y#GJn9 z-^(NYeQ)t>6u=Gsnm@0XKX>B_E(v^H(A8ToA89tGea&Ci%U`&0Y~v81TuHCtBTN6! z^8~$?UMH}pH*m0vgWYT(2N$zaKCb(;zrJI9db;YJ&BMFDtUi6bhi8BOP0+nB5KeES zcmHRDd+5D&hzD1z?+enEsu9_@Avlq960EKIPy#4z5?V z3OAtsEly7KYx)oVu1mk+;HED6EeE%JyPofR=XvwLQ9@&7UtgaXg1;mFf1co&nz!4s@a79Vbk=L26!)s@Ai z!@oRH<@e1~8j~l`UCE>~LzoOElgVO+GTBTHlgq(V96ZgzGaNk2!E+ou&%p~EyvV^z zE17)$iINW_F~gZ6rkEKa;OFTw|3b+}kT`gSgI78DD+jM_+}&;nZ0i`746Z&+xY99tZDp@PR6lWruV+%+cjZoNX7g^uMYs zW0o_#1$xB6#~gfuCUltCu36J z;A;-PnbxUC9TBK8KQl)+nsknWO87_biXUT+XZ`b@ADUa8yO=q~oDftGj!#lieXDbd zxu`Uy;9ng4dl_>Hu41k*SNT^>-k84Uqvh}e2S4$z znZKx}!HQr1AU?!1y105QGVKr{qbaRQ=67DJyUab+i=gTmQf1L(yQd}`=HSO(4IeNM zdzC5dW*!KthbEU5@Q3G!C*CqN_f z2mOX_W!}-v_#xF^#_BOd<2g z5o8UY*Tj*Hd|uN;vV;7N&uiL7p5k+ro|4b`6s6bXAAFM1U*vl}O-Yl|?nzG)Q%021 zgfgQn_#7p7s)CxqrxM-d6NAi!3O>yzUpR)(>8TS=;In!fgiU;2Pn&QepV`wTTr6D5 z=ku%-uHrL#)(Y42IX#<&TZO0j+@0rqUXCZ9Zd1yq*G%D)Y8KI5d@9XB`UriLK2D#c zPxJQoDW5*`hJH)GV+e*(GU|*bBVzRVG#Vq`^7t^me9BB5lg8xosWMee9n;QC<`ZJ3 z@f%<^pA<8nS;nko_V5WXCzy+TuFGpRftrSzmYR;5NKIc&tY)NUrzTZ%RC88yRdZMK zRP$C#RU4-^OKq##F}25P@6-u(N}X0$Q`b<}QrA&8S652Zt<-JQ?bM~}j_S_pA?m}` zXR2>jKd63D{f_!Q^#|&Y)t{jeZ(3jR6||8i5+Y z8X+3d8mStY8bdX5Gzv9_YZPmY)R>^5)acOoPGhRZbd8xBvow}!EYn!7u~K87#tDtn z8fP^wXk5~`qSUyj@lfNj#xso<8m}}yYeG$2lhUL$)iez?O*G9kC7M>6Hk!Vgk($|> zxtjT!g_^@Pi#11TmS~n~R%ljf)@XKUPS%{FIZboA=1k35nsYSgX)e%Qq}i>xMDv*D zOD!|4{#wym)mn?Sc4%GIdaZ4v?V|0YJwQ85J6$_RyINbR)b7xpq1~;$M0=U`3hnjU zJGFOf-_U-b{kIO#VRXbgraI<25*=F|dmRTICmnyCFr7r5ES+MVkvb(hWjbSYCh1Jk zS*){3XQ$3Vont!ZbuQ^#(fL*9sm@!SkGfD-P1j!6RX18UTQ^sCq;8#VtL_xtX}Z&O z=j*P}U9G!KcfV5iC*4E3Cv{Kjp3%Lo`%w3>?o-|8x-WHK>wXdmL{Nl_NRd#)h@3Wm59nkm7*F^t!S*MSu{=by=b;*u4s{{TeL*9Ote9?S9CyhP;^9e zRCG*qS#(8oRdh}CT2G*-p{J#%qbJhS*Awd*>DlQirFxEf&U&tT?s}ej-g*P|iuD@x z7U=EK+oyLz@4Vhcy~}!6^=|3i(Yvd6U+Ce_* zp}$xExc&|OTl#nO@9N*zf2jXh|Ed0S{g(!~0cjvKU<}j^G!3*3bPe@0Q@ zdx*Wn1H>WXFmZ%9N*p6j6K9FD#kt~P;v(?~@hEYPxIx@1ZWm7yPZ3WOPZ!S=FBJbM zUN7D#-YniB-X-26-X}gMz9xPsekOh)ekE4^DgI0RUi{I}#L&-hlHn}F)rM;g*Bfp$ z+-$hjaJ%77!`+5^4fh*fG`wth)$p3(b;Fy6w+-(aJ}`W2_{{Ky5oTm+E($XMUl*x26K)!5zG)7abC*VxZE zz&J>09AaE%+-khgc!lvQV4Q$uW}?CJ#)t zOwCNgOyf;6O^2J-nSN)wz;wOo3DZ-iXH3tTUNF66rlieu&5X=U%*@Oz%q-1Z%@k$< zW9{bqLC?77){bHbc5r_I&O z^UOz@bLK7P^URl;pEkc>A+Qix46ul@NU+GV$hOF}$hR0}QE5?YQE$;=(QYxxqSIoj z#RiM57Tc8;J1zEE9I!ZOaoFO##TAQt7LP5ST0FOSWAWDFoyFf0T%sc}lo(4)CFT-a ziM_-@;v{jA^p_|kz7ju4v?N`UA<2?tOL8Uol0wOF$!N(K$v8=!WP*g1G)S5xEfOS| zCs`m_BV9PSgCd)~dvn=OY&bM4-*=@PR za;@cg%UhOrEbm(0xAM1&wMw_ju*$N^wkon3X;orXX4PVatmatFvsz%a$ZEOON~={? zYm`>&thQV2vf5*{&+3HLHLL4ZH?3}4{cd&7>VefGtG}$?TYa<^SYy_tHEpeKt!eFR z9ci6noobzKonf72onxJEU2a`vJ=%JV^?2(E)|_>t^+M~N)_>V(*m&8*+N9W|*<{#c z*%aB7+tk~zHjOqdHtjZ(Y?j-sv)OHP*ygB>^0>_@o3l2*+FZA}W%IkueVd0iZ)^p& z#k2HQs4X4^To^KBQ|cH1toU2eP1cB}0U+ugSNY!BF; zvOQ~i!S<5vL)*u;?`;3J{b2jaPR&l!PTNk`&dAQn&dtu#&fBiP-E_MZcDL=G+r6}V zZTHshv(g^g6ZVw7xxJIUx4q2X$KKCA&_2pO)_$OUf_<|6VEb(QV*6_Q4*S{m-S$iE zSJ<`%AwErlTNEOmxX^1pTnkY??rb#oTS<-B2m6Vk>N}Hu^ z(n-=z=}hTd=>ln&bg^`ubhC7;bh~tqbiY)2P$uV*~i(>InX)8IovtQIo5fgbE0#KvvP#F)TIX@j_0FtwgL9K}i}QTv z9nR;SZ#lnnadPodFj>j>8p*K*e?*BaLb*Cy8%*LK%SuD`oJc75jh()Eq&d)H5HzzugJ-R#{W-A1}q zE8S|{#<|tG&2wAow!&?d+iJHhZd={9yPa{n?sm)Vcend)kKCTP{pI%F?W4QEJ>EUT zy~ur}d#QVcd$oJ5`#ASj_lfSE?o-^6`%L%Q?sMIbxxe+W^+@t)^w{8W(&JZ;>mD~f z?s(kuc;NBUy@q)edyVoc^&0I}@73+K((91dNv|_r=e;g^-SK+i_1f#L*I!;AygqwF zZ!K?KZ+)e=*xSh4#M{iG)+lZj=+HTHdvM}%amoy@??dwBH2h;sjNa)EvuD{ zlhw;uS);5))-LOieJ7hHn<1Men=4x&Q+COg$d=1~kgb-jlWml3k!_dllI@ipkR6i! zEITGUDLW%OFS{hWD*H`#Q+7voPxesuMD|?vO7@5Bo$S5rlN`u#IVET08ggy9NNylE zlAFpc(o8@itN%G0^sq*Ra@8xsk^W}@=i{;DYE9F1R*UC4@H_Nxl zcgpw3_sb8;kH~+KpOBxHpOasdUy)yv-;m#y-<3a*KbAj}zm&g`|0(}l{!t-NUhn;jZvf^j9bp0~7&@U`3cBQW2wwS0pHs6{(6L ziY!HrB405~QLGrHC{t7_Y7}D>;}sJWoT5q5s+g$gR7_DI#Z1L)#XQAAMYm$9VufOr zVvSO2u`>EyeGO`-(@3r-~Pf*NV4_ zzZ4%7pM9VY;Un}>^U?It@zL`!@Uif*^a=5a^@;Zx=2PZV;WNo+y3b6XT|S3=j`-a5 zdFJ!NSKU|NSM2NMJHXf9cbIRPZ-wtP-?_f?eRujE^gZnR()VxQ4+C5W$Ob3|B_FL+A-0yV3;x&rZw6oi>H(SovVg#V;DGFaqJR+rtpQU4rUh&a z*cGrR;6lLlfSUmy0*OE>&@E6N=o2_NFgq|euq|+EAW{ad3EUdEJ@7{0gTO~Y!XTX> zQIKCycu-`}u%NP_il8Y$vxDXaZ4WvSbTH^{(6gWy!A!6ySU=b=I6OEqctmhja82-x z;03{pf`17<7knZ3aqyeqw;{G6t|9Iri6I#wSs`4=#E_1VH6dF=wuhVz`8DLXP%>02 zR43FS)HBpOR2dVR96C6(CUin58#*U+ap=;}qoHR*&xd{pBf_XKNti>JQ&?wFMBIwhQbrm^8b|s^MnpzM7DrY_ zR!2^aoD(@O@YC+Wgs9&OvNBt4?DOwQi z80{6^FM3FHesp1UYxI=pY0;~rw?uD?z7hQ(`caH1#x%w}CMqT|COM`$rand)vodBw z%%+%YF?VC`$EwFF^<%}cezD=Pk+CCUt72yy6DL`Nt*4WyNL3 zO^=%&w=nK-+^M)Taj)Xu$9;^qjdzWAk57uvj2{}$#ZQdyh+iGQC4O7{wfMX7_Xj!* z^c?6taP&asKyKjnfd>X297GM$9>hNn4@w-AJZScy?mNqIp|e_EFmx+L5b0cv58X>XD7~0Jdt=Y@p6(V$u!A4DJyAMQc=?Uq-9Af zk{&0$NqWm?cJ@z}C)Xyk$qmUnlMf~zPX3rerU+98q=cnJq|~J}r?jSQN!gpSKjmf0 z-zgskD+UJ-4jnvtuyU}H8+>^1sljJb4N@&qEmJd63sQ%r&PZL5x+wK(>YdcPX{Kqm zY4&N!X<2F6X$#X^n{Lh~1F9AtQ&B z3|Tc~(~vDgK4cIXR7P}0QbtO~%#4K@T^ZLi?q@vA^vev-jLe*rIX!cxGV?^{#mviD z##z=`wpmqKby*X#PGw!rx;oThsOM1cp|wNVp$$XN481z^TDDQPRkls`sO*~T+U%dQ zk7u9EG03sVvCJvTsmQ6yIhb=I=Txq3u4}G)?wDLIw=wrb?#0~8d2V^~JfFPwylHvU z^KRxn%zK>gmM_ou$#2h}mOnjTc`5&9{_O%qL2yB6!HRqr$7Awt}r_sMufeOU3a@^-86FrMNP!GPg3na%<(j$^(_3tAtfdRe06F zs)VYxs;O0|>R8qJs*BZH)rQr^)$!G-)#=sWRnMxPQ+=iScJ=Qy{c8ehf@-*$i8UQH z=W4FiTpw*c+Ih6==)%#ZqsvEc9=&JuzFJ|ePOYf6u(q_eymm+JPql}}Xpb=(V=^Xx z%qZoU(lOh|92j$Otln6&u@+-Tj;$U$dhD68SI1r(=Q+-IoZq-9<7SVWJMQtgH{;%p zj~t&cK56`t@vFzL9shLv+wt$}WOadc!F4rt6YAKy&2@X~_SWsM`=#zt-OGBNdi#3s z`hfc2`mp-Q`k4Co`t-?$sxE$$9?mwU#&LhGPvU8csD_ zZuqs~dc)0zI}LXmo;7@Eq#E@a#f`>|W{r|Yt46m*k4CS?{*BWcyBgOtu4~-TxT$eV znQj(0+ct+a$2Sjb zPG}z5oZDQ`JiK{C^Qh(t&8^LC&6Ap^H_vHa*u1oPP4n93_04;l_crfqKG1xs`E>J{ z=5x(Ao9`%_?=?Sce$xD``9llVqTOQMV%Or(;@sla;@Q%#Mc(4u;@^_clH4-5C9P#h zOIAxxOMc6+mZFvsE!8c`mRT)JT6VUaZn@j?vDKi}s&!~Y(XEZG6I(l5r?jHh zIj!?s7qu>KUD|rN^>v$in|_<5&AQF5&7sY?&8^L&P3hkj))v_o(-z;B(w5ei(KfU# zr>(thYulZ+CvC6W{%)t*HQROC_1eYl=Ixg4HtqK94(*=p-t9i^5$*Bq3GK=4sqI7C zbK48rhqo8ESGL!**R{8|PiaT(GuvmkFKS=hzN~#^`>OU$?K|5Kwjb|s>+tOG?TG3a z)REdz&{3i6sP3rk7}rtX!FDuuOzA)!GdgB<%p&YI3~o$Z~II;VBc?Of2gsI$9sRp*}0{hbFpk97Xhd7|@l=ef>{omV=4?R?Pr ssPjqZ^U0x;6DB83PMMrGdBo(h$u&J`&H@N~zD0a|yO+`TIl1=#0QAK2SpWb4 delta 16494 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 diff --git a/camera/CameraManager.swift b/camera/CameraManager.swift index afb1624..a1c3434 100644 --- a/camera/CameraManager.swift +++ b/camera/CameraManager.swift @@ -170,7 +170,8 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { var captureSession: AVCaptureSession? private weak var embedingView: UIView? - + private var videoCompletition: ((videoURL: NSURL) -> Void)? + private var sessionQueue: dispatch_queue_t = dispatch_queue_create("CameraSessionQueue", DISPATCH_QUEUE_SERIAL) private var frontCamera: AVCaptureInput? @@ -301,10 +302,11 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { /** Stop recording a video. */ - func stopRecordingVideo() + func stopRecordingVideo(completition:(videoURL: NSURL) -> Void) { if let runningMovieOutput = self.movieOutput { if runningMovieOutput.recording { + self.videoCompletition = completition runningMovieOutput.stopRecording() } } @@ -325,9 +327,15 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { } else { let library = ALAssetsLibrary() library.writeVideoAtPathToSavedPhotosAlbum(outputFileURL, completionBlock: { (assetURL: NSURL?, error: NSError?) -> Void in - if (error != nil) { self._show("Unable to save video to the iPhone.", message: error!.localizedDescription) + } else { + if let validCompletition = self.videoCompletition { + if let validAssetURL = assetURL { + validCompletition(videoURL: validAssetURL) + self.videoCompletition = nil + } + } } }) } @@ -336,51 +344,55 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { // PRAGMA MARK - CameraManager() - func orientationChanged() + @objc private func _orientationChanged() { - switch UIDevice.currentDevice().orientation { - case .LandscapeLeft: - self.previewLayer?.connection.videoOrientation = .LandscapeRight - case .LandscapeRight: - self.previewLayer?.connection.videoOrientation = .LandscapeLeft - default: - self.previewLayer?.connection.videoOrientation = .Portrait - } - dispatch_async(dispatch_get_main_queue(), { () -> Void in - if let validEmbedingView = self.embedingView? { - self.previewLayer?.frame = validEmbedingView.bounds + if let validPreviewLayer = self.previewLayer { + switch UIDevice.currentDevice().orientation { + case .LandscapeLeft: + validPreviewLayer.connection.videoOrientation = .LandscapeRight + case .LandscapeRight: + validPreviewLayer.connection.videoOrientation = .LandscapeLeft + default: + validPreviewLayer.connection.videoOrientation = .Portrait } - }) + dispatch_async(dispatch_get_main_queue(), { () -> Void in + if let validEmbedingView = self.embedingView? { + validPreviewLayer.frame = validEmbedingView.bounds + } + }) + } } private func _setupCamera(completition: Void -> Void) { - self._checkIfCameraIsAvailable() - - self.captureSession = AVCaptureSession() - self.captureSession?.sessionPreset = AVCaptureSessionPresetPhoto - - dispatch_async(sessionQueue, { - if let validCaptureSession = self.captureSession? { - validCaptureSession.beginConfiguration() - self._addVideoInput() - self._setupStillImageOutput() - if let validStillImageOutput = self.stillImageOutput? { - self.captureSession?.addOutput(self.stillImageOutput) + if self._checkIfCameraIsAvailable() { + self.captureSession = AVCaptureSession() + self.captureSession?.sessionPreset = AVCaptureSessionPresetPhoto + + dispatch_async(sessionQueue, { + if let validCaptureSession = self.captureSession? { + validCaptureSession.beginConfiguration() + self._addVideoInput() + self._setupStillImageOutput() + if let validStillImageOutput = self.stillImageOutput? { + self.captureSession?.addOutput(self.stillImageOutput) + } + self._setupPreviewLayer() + validCaptureSession.commitConfiguration() + validCaptureSession.startRunning() + self._startFollowingDeviceOrientation() + completition() + self.cameraIsSetup = true } - self._setupPreviewLayer() - validCaptureSession.commitConfiguration() - validCaptureSession.startRunning() - self._startFollowingDeviceOrientation() - completition() - self.cameraIsSetup = true - } - }) + }) + } else { + self._show("Camera unavailable", message: "The device does not have a camera") + } } private func _startFollowingDeviceOrientation() { - NSNotificationCenter.defaultCenter().addObserver(self, selector: "orientationChanged", name: UIDeviceOrientationDidChangeNotification, object: nil) + NSNotificationCenter.defaultCenter().addObserver(self, selector: "_orientationChanged", name: UIDeviceOrientationDidChangeNotification, object: nil) } private func _stopFollowingDeviceOrientation() @@ -398,13 +410,10 @@ class CameraManager: NSObject, AVCaptureFileOutputRecordingDelegate { }) } - private func _checkIfCameraIsAvailable() + private func _checkIfCameraIsAvailable() -> Bool { - AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (cameraAvailable) -> Void in - if !cameraAvailable { - self._show("Camera unavailable", message: "The app does not have access to camera") - } - }) + let deviceHasCamera = UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.Rear) || UIImagePickerController.isCameraDeviceAvailable(UIImagePickerControllerCameraDevice.Front) + return deviceHasCamera } private func _addVideoInput() diff --git a/camera/ViewController.swift b/camera/ViewController.swift index 3a19b0e..b8d705e 100644 --- a/camera/ViewController.swift +++ b/camera/ViewController.swift @@ -34,23 +34,13 @@ class ViewController: UIViewController { if sender.selected { self.cameraManager.startRecordingVideo() } else { - self.cameraManager.stopRecordingVideo() + self.cameraManager.stopRecordingVideo({ (videoURL) -> Void in + println("YEEEEEEY ! ! ") + println(videoURL) + }) } } -// @IBAction func viewTapped(sender: UITapGestureRecognizer) -// { -// if self.cameraView.hidden == true { -// self.cameraView.hidden = false -// self.imageView.hidden = true -// } else { -// self.cameraManager.capturePictureWithCompletition({ (image: UIImage) -> Void in -// self.cameraView.hidden = true -// self.imageView.hidden = false -// self.imageView.image = image -// }) -// } -// } @IBAction func changeCameraDevice(sender: UIButton) { self.cameraManager.cameraDevice = self.cameraManager.cameraDevice == CameraDevice.Front ? CameraDevice.Back : CameraDevice.Front