From b8f05ee1ae2cee0fd0df7d60a5317889bbfcbf76 Mon Sep 17 00:00:00 2001 From: Ivan Vorobei Date: Sun, 24 Nov 2019 17:07:02 +0300 Subject: [PATCH] Add `.add` preset Update layouts for `.bookmark` perset. --- Assets/Readme/Miniature - Add.svg | 13 +++ Assets/Sketch/Presets.sketch | Bin 15016 -> 16694 bytes Example/Controllers/ViewController.swift | 1 + Readme.md | 1 + SPAlert.podspec | 2 +- SPAlert.xcodeproj/project.pbxproj | 4 + Source/SPAlert/Models/SPAlertPreset.swift | 25 ++++-- .../Views/Icons/SPAlertIconAddView.swift | 84 ++++++++++++++++++ .../Views/Icons/SPAlertIconErrorView.swift | 12 +-- 9 files changed, 129 insertions(+), 13 deletions(-) create mode 100644 Assets/Readme/Miniature - Add.svg create mode 100644 Source/SPAlert/Views/Icons/SPAlertIconAddView.swift diff --git a/Assets/Readme/Miniature - Add.svg b/Assets/Readme/Miniature - Add.svg new file mode 100644 index 0000000..0f4d962 --- /dev/null +++ b/Assets/Readme/Miniature - Add.svg @@ -0,0 +1,13 @@ + + + + Miniature - Add + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/Assets/Sketch/Presets.sketch b/Assets/Sketch/Presets.sketch index 903f32551108e5175fef6614d1c5968783ab970a..7f3bf9a3a084eff1dae21d7bb44b7c95a1870dd9 100644 GIT binary patch literal 16694 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%0AJ9rIsL zBlk%&eO{Y+t|zwh_Mf-yiI8$Lj}Rp!3uB(Zzp< z&)Uig_Iqc%MX~Epu2w&*GrL{f%S;YrUyF%WDN+!uU}g77p+&CF?7GxXFm?O{>2=h! zy`BftxIW!xzHm6BEUcLy|6kGAE#q}CtWYpTKvIbz# z4nC8LwVYxM;)78%a%e*8`vk;M?X*e9%-_sS4wy}FI4!Bv7T-WkhLA+uH0MO7xtum5 z_uqs1sh~_a{oEo);wgw>wEl&`Bm#krp}AieF^!bR;VeZSCK*PAPoV@`k!3BH7_~en zK^P7=;*e^;p~~?nenG%GmD;^Iw;ydPv(H=A zs5aYT1lCK4U{+R^z!yXUI^fRW#PbB)z!{XE`a%+&K4P=TrLaiu(raui6hMZ*Jl!QW zSTA$UwTJeA~8*mXVB?Z6fhcKIJ;iHDTDC zQV}I?D#ucB8qx;C2_uNOjkfF2*EFef*fa(qtTrZQTLV6i2c}pjHR;_M zydE-Y`%v3QLHgVc`A5`Hy4(_4jTR>wkwVaU0bO_ep7cPBA}y|d4f-mV1X!kJ2aeVdL0 zlVXi(|J;sFI(@oa@yG--L}BN%HQKvXmrNS1>u^JymWs>ABbz8?InLf{{2-*S!M>?y zE%i6O&-5a(Gep1N-2e)7j|R?pKgpgpBb8ZP&*MZ@{>7|{V{b8oqmx9F>oe!{Z+O0)NDtj#ECBeIiP|_x`t$ zn-?jt0p4FY3b|nGzA!8!n=`E>9@eDkXiXBc2)MkwV&=1(DSWVci&^yE7k$c&3(~R^*TuLyKN&5zdERhmNk>XO|lx36YS#8M(~toY8%U=l{UU7#`Mhf zpVPUVwoPhx#PUg~jGG1(^Rtt9K3t56cK6?ugB7>#WHwp(Ml)cFVi1&m* zz+g}pI(<5=R+=WK8{EG+H!Kp__TkqW8NEDij<-MpeR}rj%@PX^bkg+REg{+J+CPk zhy)9opi&yY`RY;IVmV3gk8XW|$N5xp`*haXPXmkjONH6sI_Ki5pEaEm@exI#fu(fc zRkWTmDXVZxd0i>wSj3ko<%oPbK-0jEL7Sd{27n0)B%1R)%ve1<*N&GBj69#XtPfc? zt|zeFK4vw`XHqNQDsWi)<#w3!@R+HDV2ecH^OB<_zRCnoiA0Fx54$! zwRG;W^WtL;5SaEi$yjGw=F0IefM_WBqDM)r(C&VtaL(aAVm8?r+8a$0!SP+k)>h`I zr)6`0kTY4@U~eovrx`qk>`t~#{u-Y1mzM4d@4CjCHuf8yQ?{`-vVRzgryk`S-`bAo zTp@BFkFt_HW;DQE+P|I=1|n7WlGkV~Q^;bRw*sZ>`WsjHh$&GGi5TqnqY@C*N3zTeWNAumu^ z0Lf_vhapw5y0g0>Pf+hkicp^rDDS(zvDLK zh6Lo|DU}PtSj?AL4EytxksY<)lO_Q!W$h_e#noQAO3fN(qjSY1)0dpuGX61+1^SQ{ z&OMHeaj}@cl2WEfuvt=|PhoIa5aY5-s-EvVfge|S19vxnI6N*DmL`Fk#I9lr)6)zm z+C^J>54`EE0ec6B{Il74iNTmtY6N?G`|TRN#MD5ti_ZM(B81t$P3jJmBHhx4hg6Lz zbv&zsXW+IV`HjjP7MIndB(Yd^5COm4#uu-k^hpjLi-%*Yknu}@kEs<{xmIIBi7GRF zcUT96?fUD=0(dSd5i8kUP{Yw?7Oc;Tsq9%^1AW`i^{CX5s<-hC^}+vY*BpKFR_GNqhOS2RsVQ{okKEllYkjqXQ3#FFW1jw#W}`K5dJlf0$I{~bV}`7P7nKAk+LYwtR~zMGt~7S<2H*mZqhRm zLveH@&2G(#!!ce}ZG%Z`MIVI^=IT@T`C5vj>L4OY+H9J$yR*o@OFEqwop>yQaKqKh zrm{_)rFiEkw?u6qnR&QtyY0lQ{}{%AWK)=g?S|OPv<;xz-$3=-8TMhEpSY;8UT$b& zoxpm3x9-!a_Gz=<**hz)rRv(k+LRFD* zvMYnNvTBc=<1jot{*6;jYT!CgU#hhe5a4CEk0sD*@6L%9wVhy@BC)s=$9u(Jmv4#k zx*LsjIoh(U%7Ma=gSKNtU~xBS2pT3ORXog5R_J@ZINc*<{@zi3F&tg-0!!fHvmfHS zx8|(1MejJCb`te5ZcHLSomI z8splq4wt$zjq1$}ko1l;+k)qp19^20)odC-U$(n?w{c&nNvk zEjB>~E1=nJBD{W~q@l6TvGRCxG&q1vBCMG$Z}YjvPb>T0##>`QD~&*-S{kKQFUB5Duv22Q@-F#PD?Bg8$F1)M~cwD zal)^$^@PVo_hItyhsR+H^zUP}oO7=+bBQf!G#$^#I8>tK0BF^j5j|oov2peqJ@KBk zU0Er^dQAx!{G5l~>3}-L)J@zcg^*1hI{(>2Qd4xWY(9$OwRBL(osRtu-*haE@~q>j z!jShJ(cdH$G#ltTxOi`-#CenRiB|JdMyoM!*fMC`E_!)K@#$B2XY-ZLp>^B`^EcUg z>C;sl4?p@ai=xBe`#r$!4hO^%uspGxI^edMh~qIC6~zHHm;~=A%4+2qt343hqf>G} zcWue@(Ajo8?EVaXfd9{H3IWQXaaChC0g?KijO%UYZR(CGC71`RrHziq6NA#Khk!WW zH8aHb3<8I+~^W? zf6XjETw2+F_zT1TO{4=NeOdi-b0XPYJ@2D~jjncOGs@=nLil9vu0%qlu#4cam_%6Y zuB2HM$E&h?WWVD#tep=-dfz-v1``a;6e|lUOQbuRE!O1gnBE%B+=S_EUk=kHBH(c~ zsiprS3eLa7R@@Z*L;DF-L2ICMP`QtH8%8v(X_$LFLKdIRdhHz7j?ZO619*@px=s?J z8QBB#IS#I=fhtx3X!^0Bfo2@&)5*Ki#dTX^krIT&-6$o#~tJ zQGg;`S}H`}d0E4Ab&u&N?56AJVKAp_JVpgeet?&zln`g73Z+&b~dkC@+S;jrmJihQidb3~s;P&UX&# zzdfp(uM|c1rsQA)m|}h7fx{k##p4c#Eqt(FiAP$lT|Xu>oK=qwa4gyXP)n}|6gK6G zaYa_kp-kJCT9ryY-W{(=KV5*H#|vxn%Z!zJ{!+aqg}SbjYIQ)L9h5GY3$iR=humRr zEMBwLq**l=7pNnA&j51#?d3X_r%#T}lD#45vIPe?`M~ELM?qjn1LRbpy3 zc${+1ck3E7ggi{|_}G{4)qjV;)FDjtFgtreTuUsTE^L;|yjh~Z`L$b;rV4mmDV(Hq zc#+_jn1gW67^TgTeu4%NM&W{~K}B%=a1H2J_=Fm3T=gJ18Y}!&jnDu(j#gXkOA=h6 zE^irPC}xrzFRt;N@?nb!1EvL z&y8xC#hj-&ydm{~zK_DelC?mZ@S0(rD2fFPGv($ZyN-|W53!?OYn`_&-H$adhcm*J z$&8`Pn0t%jKyY)2rpkV>*50b)I4No~8=~u7u()-BT|1wPg=|dMwA@96OoVO5S zmvaVSDgJ7$lr0pLr({~H^x>#FiXhrnd~+M=4s0Hy>Ieml9|YUzM6H(fw4xEeN6x4Z4+vQ z2Zt6yXs3BLEHZEDf!r=W6I{2K;Zc!zI0GbdJ|TU@59%#CzWWIYkCTLU4W6emsDxay ze+Ihis_fqfP4_H;2RiEh`1X4AHjHJx<>Oy$N%nS`*eTHi39nR0NUJSv&}&Q0({4VK zngdi51=hHQ4Lqt9IF9K@%V+evK18sXuhiD=lZubf3r!FTqu93)wFkA(yrLvof(GlQ z6?AGyMf0L za|GJ+k?Q(h@o6({%_9sRXV$9?v(+Bu>#Z)fA6vpm3d-o8PnXYhP)Dy19P-n=<}}Ss zvu&rLQi~Vf(yp_PS6kUl-lP-hB+YAzlJJzHl)(0qSS!zb&izy^HJ2N=;1#99Gd_kN z)gY{z$PzfBtGlNZzX6#*^z;Wm;C6X|JkZpo7+h$H?|$9H&=IYK14c=l^)2bN$R~J& zrQ5KKov|fd{LTAi(Sk&jZ6MF&<_lRuU`C$4SG}2*TjzElsyv)AvFAo6;sB5U&n;1` zz(qXF@gF=706GE?+I!uO${Wkxe;eDMFs6bAZVo0RonuBL@?u{cWI5CdWHggU_3Ak= z0h`28ipr{6*jVvIQDR^~d@ii1{-irC4>T$fZgr|ZL0lzVFg4#KXv1J5D#6?)Zpm|W zA2X_DLjzL`K#lsIHRLguGIt#*M?Ao3C!f>4; zPjffx?H&~Tu~qtpIr=VO?$+PPxC~7fsy_ar9lg>_=eS!=LQA`;fD`yE==(Z1I#lL)IO**q6(utwS-j4fQ!xjv99-&3bpI=+B2V zwLo1Edg_v9HJMLxc%@t@7tSS`x-BzEF6WUf2lOaS(|&!OL!PkyC}%PDrDqPSk2vVs z?|ZsWr*gteos9j656}z7YH2g1nfKF2h4Zwj#lBzvRonaV!E{lzX?kU3p4nEKTC0%a z9a*M8I+u8AFu*Hjoq<+}5YlhXdTHQloS#5ZtJ&Tdi_f!ZpXE^H+v$Zyg_T>a`biHE zv%Q}L!skNK=Upg(|F7Qc<9FQyL5x21{&H)9Y|7)53s3r?3M~^zzi?O!lCQvLXh#;! zJeQLt+Dy;O>f@DWWfo2KO1<{HDdhN&X&s%t{g%PySI<W+2W9?-)8t_JqZwJ%dBDC@hcI1o z_!)|&z~}#i)BZv-oiMn%g%LlNg6nKn4PVsgi(gPV$k8dn1^);U5G2a-2zNeOsvoc` zO>LK4PM_`=xRBu!P@9!$z;F4}-P(b&55yEI%zm3dJCS&~!8%q99!FxnVpXJZZHS!c zfAAL)o&bPc7wsc`YEW^>qLpqRiT}IQHg}+?wYK3sW9Ni|*bDB*#H$eh?X(Bd!EW~t&$r(MerJE$)~i^B{8dM7DapMG(QhBTmp%Qw z&F_{MXOTTikbe91`I-|g8>_95S?y?aTjGAWiykbYqQ{5{SZ6grr)>B*YvBG7mB9XI z_yNURC^pC8(V!A2oW?Q3Jb_jb{HJ!R*Icz*uO48q0_C5%|A$}&m3m+R2Q8U2qwy>~ zDwRjQpaR6()%@i>!8|`dFVb5NFr4BI`uuL5|8|Lap1;D!+dV7wZ3mZOGjHQm*Td*6 zqkU6pv>0Y+lQ63?m~{%#e!}$w-Se3OcJW)pn<&%&75D*+5c&A;2$7xHHyvCGK% ztb=~6+W0e~^}Z+aEtjF~bhA_bXgKK(Z?)=EZs1A~lIayOcv*Kb;@}>wW_Onxe@%~b zAiNeD9Q_t9Q5WCmk#y31rk41KVZg3f-x=DiRVlLJ5Biyk38k~^I5K~7df4bO z&lCeMCF?BUiZqma_rNyTU#Zj=4(c4S4CYV^|D3&lBWci5e3w0ZMAua zZteL#_jUWIN$BaB@jKQjCHv0D%X6~hw|4cl{ue$U?;&akhAMDNXjNl@y$=a<@sip$ zUmE3Y&E*+#C(1qAVe!}z@c0TA8AFTug(1Jh=yNNvhcJJn84ljz;PwWQ|Kn9W`4y+x zqXGci`v3p~@KxCAnHV`Ruzz9}WdFn@N+-t3$w|k;#PNwv=#vNs9g7IFkf0cw7$X}K z>t8SHlvmpU_g95a{`UTaurDdpo)y2GLt$&-^v>O`?0&eujs7af5Ah$dwdpVSuxAyw zrxFP#GtP%2mbEL|(Evdt0LWEk?0cFvLcw%wB86JO{pes=?DeHjpUrzEXKE{T{zSka zk8Zv>rhoN7mOZ7$;?$0YOdYx7)#UQ!Lp65zo7e2;4>g;vj#rAEVX>RF1m0$2>)}4Q zY?+mPv5SMlE&;=4(|nD1U$t5H`6DU1`TKJhH|(z$ZAJ~*c)qw@O+TCnJG3cZEZcH< zdMu{3q{&p|Z`famGe4Sfq^syue8_buevYDXE7D2x#DmLE*gUvhH1u?P9Cqb8Sy~jv zf#)0Ypx{Ro@9sQtM}bBT`|5F8FfFMkM5RnVjt2||8&@CPZqi-_ytrJU5Zf6C3|gM1k9SWtvYgBx zFQ9EM{YspVjc2Qah*>O|6mYfb^fnol=orTJIaIpef^77Rzvqi28Lggt9?ro0u-|=b zrsHE+k-?l-qA~xi(heXqmiT1Xco$DWGkTD8<;mFkV8j@k5bmCU6`7)Md)q`(aR&2d zLEEyPIC6aKc3|nrnE@p?ZfIJj+V*6K3%@2yEFPX>*6(F|EX5q5D z-6vRnwJ6Vn)Cq1)wm)&cX7Bc5905^pzQBhX<$U@%mb0@-$N&1cCT!1u-#u@fYw)J{ zIDP(S7RAu~wh?ECP|B}%(G20LauG;5M6zjCBS0IiiWN+`WoPmb9JdjS33bI!YU)Ho z_aBE*q6Pg#tftty>9M6h=rEP3CgVl9vk8TG8ASSmc@RZqo#1c61Kr7q*^B$vF^b(K z^NwWmnpCrzf>8=pw5v)RRojZpjl2{}%4)v`mF)?EQ_rYV*tsWhtQMKmlql$qQq93E z%KXHw^BXP=>x4(&9xkNUMN^ewPFa^BUb(v${yujfvo>m4k5Ej5Mvg3&#>UT@d*2## zZ_V`9aL~OFz-}{+oDs3lAmFLTg{xCOdA652ez^TeaeEx*RpQ6( zG@K)C-L!2{YFXZq3Vq7&h)U+^C0lcblBQm3C67OH?pJGK(c$XIc3`xJXpbm8zE48L zp)X{Uj!-7UXr|6nt@jBBv2c_|fr86M-iO;lY&xM$(Qy`f!+ng6k->xcq&&qN>s0X} z#UZ&iK_zX=o=4kuFCOY@vGO$S2RmkfT(@0XMV3#M*jvruT!d6|5bTj;Cub-c8WuY+I4l_*QrPTa$3Ju3GcPgmdT5Q-AGK zf8k|_;9t_`=81f@+N;4aLF=NuuEij^1)Nb^2TIdN;WmBmtDbL8p1fQPO9irO9WIrk zrMlbY1Dh7xnx7M8#A6Xe%V`RspyHhbY3j!)X_@z72cT%)AFNOo=E>d2Vg;)u+stCI znAs)qYB53%Tkgnt(v}Gt0#}ORvJ~qvx&yUaM(qgT?_vl$c>oTw_e z+3CrnPrn;a6G4m_2tC|I!?r}ZZ_!sx9rmM!RPNWX631A-L*AeT-Urx?LHE<7(I0~r z2}6?{%5E^TaO!cyeYoP@nzr+Hrrm(rmoy? zY)>Ay`6)$sKSnt@`j;iT->u&fu0W5hzQVZx+A9-xiWP}nwVuE%h;Jgg4&pVkdrq6Y zjfN zO)_v)0#_&5^cFjP`+Q3i*pLzL_?mZ2q0N8zBsu@?;pmkwM^`CvJV70m&^6R6bkk)cfu zyr6)P@R;_tyA=EB!Scy24AksRN zYdah#&*%lstmmB|Db>|^NcPHe(JC70* zI#EBu=)~_hWrwCn8HMR8%c@j-{;GI(Oj{ajl&IR9DYO+}iXR=XlAkrxSZy>GI;cin zU|}Dl0oN!Uf=G3_DTw-!cDBtnTOJ)(6(d_Yn_gW-6wayC;@B#t$4tsog1|5CAsXf5 zRF%Z<>_lXIJOMqy%a|8~5a;$7!hx3Zss;u26G#DMt>r@2p7^ri}8d3xPrsNey|1BHHc znpIskFwH4?%vqCu)ioj{Tpx5^?&*c5=8}zK!p9l@Zq*S4$AHFGN2v%dus5h(MiqD4 zsY!!h7G$J_7zCkF8o|TLlyu?+O_E)Rq`*9ggkFyxe}^^4V^j%d{$mVTyK_<3<(>li zH9$OSVD1Opx$yIJz(93J&r~YY3lG6;rtNW7BRXb-mEjsPdc(aQIdLp2VGJu#LEbmn zEm&K&z8nN0hUVN%EIJMSekN%`)39GKYuxu~sQM5fWd4&dB~ZUYM$oda7l<88S}K?k z;$e3Dt3~%zE^y*6tV0T%H(;JWlQ@6EU>hQVCJGnPmtCM&9umu4Thu>%($G(OAG0s6|R6$ zL)VYxP=E~kfrbMa&1|gPjFx^a7dqzGD5^hNd?sx788h@+R~5RM%Qj)YWNs(ET&k3V z#zBP%YunthZEBEOQZ|F4ijxXtw$WIz;*MBh5j#FrpyZD1XiBWLRst8}HFt$aHM4K_ zRyPfC$@dp5a#*1*6fLJ!IK@#tb9EsRy&7cn6c!3}#L?@?-VEo>Rfx&lQk@*ZXUbz; z`;SAKZt1<@LWc4CWYi;r0m7RGvV&S?^SOqc@2$-QkG01NOShDbp&2I?;vXylsJ^v! z;A^!Whw3tAyCCiiU0TQK%daPhyJxa-O07>OIxo7i$&TM++H;_y4@f9epz!NXCvywC zBc_eVdnm+3+6Ky|+9DyX^{D`vikw-_!Qj`)#s8N3SfDu<}HBB4Gi9pYVS9@Dl!16v#rWfd$;7Z!B8l-*?goS|4- z3QnmlmR)I568>H3JkJmoTE#Yzp+t#ClyM{RX&)<@lpPu*H(xN3JGxqAAN=#97P zKZ~hh#|Ic6=@AMj(wRHMz$71)`{8ThkW7Oo=yq_Aa$Gh$RS#rD>xN;B7A!U;s_nY5 zO0TNXxbus`*+rLzSUA0=R0||uJzI|U*VCIw99*p@=SxPUDlIi|;)V58iihP@IGe16 z5B8ZV?^z^>Jl0_rms#tMgL&O}#;r8eqN$jS;99#Ipz%C*rL*L}31J4wo%OT)mu5=v^Fy#AXzDtOO(^g&1Ak1f~UDG+T z5aNcG(ye{C5_~>OgTO@G)3Z_Fp4>g{WPVHdfS(=Fn58}AO_Z@u1S4soWlDG5uJ>~v zD}epOz_~IQLi$YYOg8#{u4 z5PkQCNI|@1JDKkyc|m-YK!tCeonGE!jy0A0kgmRcc~g*10L_*Y(Vvf%{4T<6BZsdC zbyl2S%>GxG58dLEkV={psFJYy z*BfSn*d8!g>PD|ZC`CLjc|)$DQg9Xwo=f-q8n|+sSm;+O8jV>y;ym?@l-n9xV!K+( zk=MilUHP?HaTqsQW`g?bDo){5uvo$ZgP7F)Fe=*d8b+{atL){&g|%5|z6n$Qikk8` z7*uqW`4B)RlUR&eCs7<>D0BsRH;Au`n%wb92rywSyoflZSDcGv>*IqraY_LzTO8=y zxi(tdgn`b++LG|@RZv@@(om|2FzKicoH%1}=%qrz@(IeCGAdH=QjwW)IC07og}-RF z1H?J7VB8<8$+|i%%NTLb%?_vN`77Ss)=Zq747@ak!Tqft?Gcd?nJAEBzv&gx4n)GU}a-%gqSK>Kpfv`3I48eT?havW-MIver0K@quz~!0$F^E#{ zu$tRi6_uGm$5cnyFkrG?)%){YpyT;ekPFGSu&ukDo{KHg1#qa7;aD0a+nC5$?vDga zk)OqkZp>}AkU$!yPBd7|cX&wy6skH+ncLNCzGy-U4LjR)@^(+MeftbxvOd(08e!27 z$Qs?6>O+CJ%EA^^0;K?3ISF;v|FuMG?Z>ERYlm0=NjRA7;$*#}TXLfVViI&eku721 zO8{w8-lsqb`jep`L2Mi8#01ba!EneQ(8@T+zZ7*VEt7!i6bn~N9>NV{nr#`aXJBB6 zT^6OLMd9}q-OrXLnwz<`8Da(*3-cewoZwj7QyfjlT*dj7LvcGjmgh{{%O#y*?% z4+O~jSnxT$5YJ`Y$CF4^*7wU|%_J12K7^2l(5J93P&im%nzBjkb!OZ$v+dJf+ z;X9FtYzEFvmO6iV#4ECa|eyb_NHJDdHz%AsI}*+Js9cm81Wn zA?13%lz*I?O4{r+b8&9?2Mtiq3%Q;fc!8f^1^dLaUSIkeI1#qpZc z;WT;ZbD_p{MN+9>5*!}CSf9FotDL>}{s0zZPl{qvk7&XhAw;ro1jyZ~2Ro^`dMtLSLGw zGzRL)kx{<{oInTat+m=`lLf)i%_?$va_z5phSKd_}?>mqjIN zK@~9vd97J8z@H983<7K$4n&c=pxjD|;RR-kElyQc%p#px>Q@#7L+hNFe*!v)sHhT? z{fLEg(BxhkQ&U`xU?tJ`CmGXV=(Q}bl!U3f`~J};fOvZkeOu4&=`ut7oDprm0Z78V zRboar*6U0mk*wVEBT~X!az!jRo!MQbo*2NK%vfU>=jvzd{L1H->A=xwb{K-h@})2jG8KrUY)_4~T=JxDcRX4DS$lBVwd3X)GfHpaxz;0YHMy0N}r~ z00{?3003AP2mq*6z!YFw7U+LH1wG3G`>$(&_3w-aK8;fV0AaSIh@i47$Z0yXD_U=T zznp|RiKIFy)b{~d00@Kzx?qf`;N9*}8x1$9Yvy|M{Zqz$iEdY9nI1ZlD3ZK92D+^Q zq~G@w>A*lyLQ4=7SEoMqq3GnZjEuvxqnq}Z2l8nZZKorbNM@4~xpbID3YctP0MtKE z2^qrRnJGaIU=aMDCngBT86)^VQ;@1afN5;TG2& zYh>i}R{PIP6XvCpl{z4$I|pF+UwTSU%zy{h0lIEkxOO(l3Z3@6~B=` zkof%Oy58cTf%FKjS=#?5G*dma(&iM*6gZ7w!YhAk+MF4WMV@xA)#zZ}OqBY||24T( zcOjF)21tmx>z!{r(A{r5Zdk7fcl(l9cl(3g2QHeYa+7v)?QUUA%uEpp=&v3`NH`c$ zZdZGEirZ<@Rs6?}@XsXvubppYB!K6dAH00;x;{+Hnd4Y4Z}|{~t6a06Jm&nAU{A(1 zN4wuH9!>Hgy54ksfP7FJ&+}Y&Jk?A4nQHy%1}PjoA9^)GE0D;tVGGe0GVySNUk9@x z3#CAw9ZL3glh{w>5O_IMV91`Yj~cGUlzVEw*wB}O%>_-v0G~v3zwJx}DCPUUa;jY0 zkKo=>1QVoD2mN?;b6Vl_fD6R~Pb-3@7}G$o7^V(Fb=vIVG?{I|Q~MtiJrBD|x5u(! zDD9DKbLi7JOgPKvO3`Fzf>8I{ZEOP`LO4a%}|p9F#!O6dOJT%g6!!tLE^!o_}c2ga9D2`GbThC@3M| z-=`|7@3wW_2S&a>^wN|N(60?f$^!C-a+N}N*!|K3!}|D#G!`V^?FtZ-lz-~AukS4Q zM#GnKkZ{C*ivo(pf$FfE2SCgGv$g^q=AgDK<#T{O$UmgP152>*4J7|(Z3%T*fx|%6 z0MSOJoR46k_VFUtZQMEtxkO!}$Yfa_u+hy1)H@GYM0^K?ww`8jI}dQZz(WLF-#i761_@R>-gc%?PsXvlv>I&v5J<@s zB%l;N=VMW8HB@~9gIKW8)WkVmZ;zUqwowQQMK5ywxdn1}uzp&_|LzJ=>STXq_T)TG zE+r$GA2);6vz&_1w8-~p_Fv9Q1kss{_EE8{?>W>H2P() z(`%p8P$D}6I<40Cp*VWsaTZenGAW)T%nFD7H+4x4`yHrsewVdbldqE|%7$p@lt?8* zJ{f$X5P2Cgoh?CceVH0o9E8^M7vH!$UA|cy8aM6!1`on5yWbl%O(u;o?XvD87w`c- z=lctCCn_4Rku+#3n@z!NW@WvjH8wVOt?6X2a)Z2JiDG_9ezhwuUSu;nb;F)1sEN|p zRJBp&)Hwh7?a<~?okh>PYzBv~-@K6_0&#$uFav}H+y!{_iG+# zn7HB)FlbQ5^9MAz$Q$Rg=rjq^%(=bN2@~&ca%6`Y7DE!F{pf2W_$K z2tyW&yWSsH@)T;>i^e4}6v(tkRd2UWr%BMppjtG3G>fr>h-{XPxX6v;^|+tl(lhnA ze>=GjQ#ZM97&QcCw_eG*-0q+5i@-fRTWxL<)1gnR2!h2lwi|H^vS0ImYw)mr? zz@~lnl{4R{3y&Nt^MX&iF^BH!SLsaCST88Nms`w3a)*m7PbMN|vEXFe?>#4+HB@9| zyW`Da7<5u#AKCC$MFZ ze4-1tcg^h{-~GCMEw8AkNT9j<6$7OR4^Q7MbcYSpjw3|exO+Hf~918wq02w2gE;gW;g}#{1MC8{hTB28npMz*bym5cbC>>_muS9*IAEOvkncs1O~Nrw7EPrGO2VV|57UG>>gu?N-hxvo>@ zUZ~sJLic60Xq#BVJ0&H*IAI=FJkMzDA^N<9Mjljcwak{n=^!@IoyYgKW3YvUT?d?Y zO8M`tit0ppp&o<@IXRR2LV5t6Oyn?7zP?<*#fduHIW%o~y1*xk$~m3AsINy^@ep~I z328&z9+%xRP7qC-$u^XFO*u^82h{0!Hn+{|8Tn&#x$?^+t>RI?_Al2iuen@Ma8NSaryHuo>#@aFdEojR2TkdtM7f@NYVpf@nVK!ld>Jl@L5J^% zq0N)?3wY=YxNJI)(Q$-A%TdNnn5S9E&U{N6$`$fuT0Auii?V`%PsZEh(RZKPvCMW~ zj_nxDO@sDSR;!9RxLZObMn9!O*{KKU?Vp6mjFOJgt3boyK3gx6M&|Pk59@@u5)2|@ zp#q8cR4$qHlez!#59EbR!*`jUmUB?DXC&9^zF3xnx_K43!|A5=K3r_)rTvj~5(M;cZ!eII$!f`IfB({D>0knI<5MBp&kYf0|;-l&f2m4!Y z0;Q`_Hfl4R8N_Qk@lGlNbcc0rLnurKHi$~(&N#Yf1EEo0G}CtqS@0;vA>FCaBY&MQ z=2F=0;i4firgmH!^qXzvg_ML4jwHZt`vC{&MgxCV2)y@>Y-D(N&O(DaUegUgn7c)$ zS^xc|Q*FxjDGT3nR0rFj2Sf(AROPNTI?$}S?;Ic_YcfXG_CVB3^LafvF8y>U)XzMr zy+51|KANwrTtJ8?)FlOx_29PK5|M!>3XcQx3h)gF3R^Ek=PS28oQgVY-g+Jfg@BRQ zvc%(6yg^=%kSC$@t7UoSKAW#xhjLFqHbdWI?4*vX6d?H)mDS>QO+EJVaEZDlz_IJ- z?kRK}SFB_k+yf{?j)w{Z0FSv#_W2Tv30xQu+J*aG};!m-D$(X&+_ z0a_;^2FnU3GK5UjLwAwfmBvJ`MXjguVK-5Hnu?abQMusADBD<E>HsacDT#Z&;!D z=*KWWlNs$m@wuHxv`=s2w+|o@aXzEdsNQHsg%NHrfV?3e(p&0SE!R7>_tHT53Lrrx z5m0wuCU^i%E~n$U#;=d9DnW>ZlSj3QlnVY^V*Q%q9d zo~}h^bn4}O{AHN($?HS@_jn?g&1o^9-6(BbptPga2a7>F6E~c+>v{6CUkkUFLx)@H zj!?cqS8!P_Pj^$OJ`;>QD;?mY8X1Xus_EA5dYLnh>+}BVlIe5?!^dd-FtK^#df303 zcmV?{NYsHHzUFnWjZ8cpJ`_hM9R!1+$cwISr5jjKf-KY;3zf9ja6R-CAj=(KOu@&; z*SU+8dP%m$=PN>&_;VRbDv@5MySF4x(;3pmqh%>TAU|m+MK&_djqOvsz99x;HMYRU zX7ER6&hty?%bwC>_aR|KUQ#}r;M6Ad9C6td107Iyn>ErkZj3S}w<*Id3K2@6g)dSN zG(?Ioaiwn7{*mupZcH5ix)W9`q1okpYD9xs1(DEhSiZuNQ-*4B<@D10BWS#6g=KSp zuv(?+C|?JW*#s0Cnp~LcZo1mWE1jqAN|8eDM(r~!!s%~ELjVP|fb*<)UlF~~vi5o` z>byWERgByDL_V%tTccQ?42NDd|AJ;+hSZ~VZzw*DTD8P*S<-HVxsXiMjvOS?Y2Sf# z0ihOSj13hRGZ<{U7F3w~w^tJ#?Q0h4;TU5&dx*Q+V!`X%L#G>0tztG1P1G}nFLg&I ze=PaDS5^_?xx6^f$T~(#OziJ|cOaUbeS{q4No>9!sV!nm`>uA#8X92yx06GT#5igf zRg9N=IB8v#?otjJ-Js#Hw%8f)VUaJqi}z#86ZwVX>5_6$^eda|l~Pt;MCLv3rx^}^ zfXP|XQ>U_>yY;stPdA(KmPd!fdEsE?!;HJRElA5E|HW67P7G3{{#HfD-r44P8*T+Uy> z?T6y1YJo0O`*|o|}GuJYU&tk6)UObI_;LE(mtCTFP#RM;TfJ zby4DxI#+JRY&I4#a`+;jCh5y;Ll%xJ4s;i$;eGF4Y`>45@p?Gk`{DlWhn5lPHf@hh zvrM_QyPs0qMQ+DZ$e9x_9W?G2ncNfDF0oDyWkej!6ic&~s3m&a=S#)s?2VpcE|Ku6 zr$V^`XKEaFJ-pQhJ7I;bA7s*sMs~7(ikq}wrVHhAPr2)9ScUQbehG%)w00}We#m1U znoH#H(2l2b5m)?iI!lsQ1Tkx^&)}Y**|n&Fx}o3* z1UwR`*mU_y{jxJa_v*tyZO&O~#a+mfVzXv*u?J!?zi$fc{pg>`tsv=0r-Jh4OOt zzs4#nc%I#g+tVA@d5!V-j3+=6XkQVpbl~9DtQNH(J6>#b_C(gG1hEex;4^);OcFg3 zFLl(NZCLlY#~)3OJqYDj`;l!tnzGf=Fwc_7JDKl*X}(ljte9BQ1YGSVhT>^d{#(=| zc%D5_R7$!_jD5NR^DInd*4@cuEDoDx(Hz<>;ROYVbDDU6BnGa~$H(gw4IdFPF$GI4 zT2b*Y_uZXkjrw?UpzGF4BG(urYOj{tXa%p&xA)w`^3Tqvhxv(L@9<`Zo5$N9(h|Iy zMx^2C{eTf7-xcr&dC}yW9tbHpuKsk2yrUKi9*U6kJD?3F|N3+bwj212F9BTFe{6|G z6^M&|wXBiK7799m|784AJT#e=v@a&G1E?gXlR1bg`ECWB%)oYj?a8!pmpWGanmvbu zfd70{T6vJ0|M3tT^!|4U%$E$@Jk${3-TQg{=5E-ZHh15C1PEr z!qM~x*L(-@8(P1&2ySnI~5IuFx@(fM$RC{?@dcTC%CSI#w&&2J04!J0&3!r615-41HN3DblQ? z06iVre@)~4rgop3ljB)0D0)X)Wqxa}+2+}JwDWZbY`f`2rY?Q%14G*bvD4(l`W{`X z*;q?s$tJgEzvy3!6%?CapT0t_+IR**7|uxtA~N=`6I-Sxex5w%6*pp_s#Qb;5f2O1 z9nHRM`qmR>N%&qHAYx#D{W^#Av1}nGQ3}E9JL=`lA}9IyaIKvrl5Viq?U70eEijZK zh!4lX7}p)e{aQEAi_kQ=jOmlrLS2n-cL4St zu|*4thto~OWS*~5syb63gIj0ZbexIIx#kg~b#6X3S#Py$3UtUzsHmM_{c-6iI#Qnu zX&$e3VTbn1EwBA~I*B@-on{bbcDfH-+esLH7zOLY_NNOrr`_w3^dyG4#5_uye79Yq zQ7uctzwzgk`0OjE?sYxN4mR|Jf{ZMfD{}JUFyKu3vmgRBLW%y$Sh;ShO`F^N(O$aF z7-W9F{7d4~?QvmBzVZB-c3e^t)`jbVfGp^wXih%r$WU#|RHv^10XUb-(dQN&acRAe zF_?oHK5uSxqxsg`tFQ^mJJq{Gp=hRFRJ1H3!b0BbYFd@xg{uLuYgppGHEl23?eCKC zN6+uD83w!Wx0OB$z`cDDs7Soh(u6?MQHJL9C4Z*YjCp!bq12cTheJ2(XgU+P0!^>A z@~4txeqf674W}{<6C1ua=;DdcCA9%xfIeSr4W_3^<5x=!n-J#4ltWzjz+6n#rlqe> z9hTcTuLO)|Qh#mXV6~VFcLgH?zEMfv?KO{^1KHV9mE1?-`@2~SHT2;9yL2w6A-1Sv zG>R~(OmKu(cL}Flllh9(qRpD|r<3j?81EDoi9mlZMlT#AL&FEWy^T&%VRnmWJS_BY zD6X<6ZVN3&VaguZIPBH$FvZzY4(j`OszZ7VEfZP4YSFWU-L7`Xy|2vr^||}gi5y10 z9M4rQ#IPHVeFJwTx%pzWmIKk{c3+1wcu4wua~7Z+wJ87oCL7Yu=!rfrr5HufV>Vhw zt&-{56(6E^1gUfgj9h;09f*a5CHvaB@S=aI->Y4k1hgj-^~qmEV!I6$1bm@w`#SuH z4RjfqS}wo6Yc<+WE8=FT=#|Q2C(%O zacWJ8;8U(xS2FM^jR6*7Og1Yq{7pF+n9UI55e*Mxu zm6Gy(CijJ8s-(-{`YjV^Dru5|_SN|UeCi*lUwYgRCb9+XmR1c~2)9;e$9gwD!dAye zd*tv?&fJ!=6SM^0W1v8dXWmM$3E9DYTspgR*&oB_igxq`0z0DWYT>8d4Z1#^?2mbQ zq*7_I5@u#*6=NjC#G)g{E?cwK$wQah6oF|ql&rUD(zI_^Cr?ME%7wDp(>;N&$={X? zvUYZ+Z%zwj;!=J{Q591;K3*9`J?XZG0DbM8NztBy_na94!*^F;xV4i&NDYYpXfHUf z-i-Ua1&kHs88#;7(tbn0CPxsWP0y#t!mPJmmU7q|xx^vvgXDn6gyhsvX<7UTL_mI;k1w`9Le5<;wx$gk^`77!%a3 zWkNBQ1GJ)|^q#&KW;vP9-!&NT;o96m_OE`1KfoJK-Ewp`3R~W27|thO$kckWO<}3x zFErDtc1 zfn5a$GO!gM^@aS)JO#Rkzt0XHAfz&C5E1jQ`@d5K*nzQurpZmQKY$j-C?L>st!_a2 zM=DTMWV5wn1M(ke(Fh4JM#D3Q1^q{=BM^nE09NZyaPu077O_XMih=%t3#|f!BFAFE z|36mO)oDdoNN6M$KthG`H{>TuQdKn-(qy}pM#u80H#_|=@Ng1}w#@M_@DEnzvz@6< z)5TfCKClBMrhA5vAdk929M~rFUT}u~;(KL+LB-`(z?4m^2_fH|m;VbtJV{hYT3AS= zZ{a%2&dw$e{gxdE#qn33AMolL`y$#Lc4MkbNmC1dQ=Q}d>v23=0ZToDHn5@& zdvGK=(l=58S@aFy>X2ps7hvg?XA&5`*dkn@)5ftvh-LK$C4vPVMzf=H*t^0^{4=;T zzzKuxw*x_bkcCWd=LTk5P^r6ppa(_dusbH1tp}A1jo02rki>i3Q4DcsQog6>^YBtL z1*!)e#S58E;1{nJ_#Olrr`HTS8I)4QYrg^KGs9>p=6rhjeMk^*p04)Vw3FKPDA+p} ze)#S8Z?A4lK)Pal!ao_0Wdu_2ftEPah{x}CbWc%;kLjT1E_}}b0`OWtCv4Z(O??I85 UhWPM12L$j>0@z$B&fj + diff --git a/SPAlert.podspec b/SPAlert.podspec index 7920d3f..79d044d 100644 --- a/SPAlert.podspec +++ b/SPAlert.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = "SPAlert" - s.version = "2.0.4" + s.version = "2.0.5" s.summary = "Native alert from Apple Music & Feedback. Contains Done, Heart & Message presets." s.homepage = "https://github.com/IvanVorobei/SPAlert" s.source = { :git => "https://github.com/IvanVorobei/SPAlert.git", :tag => s.version } diff --git a/SPAlert.xcodeproj/project.pbxproj b/SPAlert.xcodeproj/project.pbxproj index cdb91c4..bc034d8 100644 --- a/SPAlert.xcodeproj/project.pbxproj +++ b/SPAlert.xcodeproj/project.pbxproj @@ -25,6 +25,7 @@ F412052B2382AF64009C2AC7 /* SPAlertLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = F41205222382AEFA009C2AC7 /* SPAlertLayout.swift */; }; F4A5A92C2388792F00B0DFE0 /* SPAlertIconBookmarkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4A5A92B2388792F00B0DFE0 /* SPAlertIconBookmarkView.swift */; }; F4A8361A2385588300EB32E0 /* SPAlertIconDocView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4A836192385588300EB32E0 /* SPAlertIconDocView.swift */; }; + F4CA67B5238ABD0100E72F79 /* SPAlertIconAddView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4CA67B4238ABD0100E72F79 /* SPAlertIconAddView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -78,6 +79,7 @@ F41205262382AF29009C2AC7 /* SPAlertIconAnimatable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPAlertIconAnimatable.swift; sourceTree = ""; }; F4A5A92B2388792F00B0DFE0 /* SPAlertIconBookmarkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPAlertIconBookmarkView.swift; sourceTree = ""; }; F4A836192385588300EB32E0 /* SPAlertIconDocView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPAlertIconDocView.swift; sourceTree = ""; }; + F4CA67B4238ABD0100E72F79 /* SPAlertIconAddView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SPAlertIconAddView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -160,6 +162,7 @@ 706F89492383277500ECF5D1 /* SPAlertIconErrorView.swift */, F4A836192385588300EB32E0 /* SPAlertIconDocView.swift */, F4A5A92B2388792F00B0DFE0 /* SPAlertIconBookmarkView.swift */, + F4CA67B4238ABD0100E72F79 /* SPAlertIconAddView.swift */, ); path = Icons; sourceTree = ""; @@ -363,6 +366,7 @@ F41204E92382AC9B009C2AC7 /* SPAlertView.swift in Sources */, 706F894A2383277500ECF5D1 /* SPAlertIconErrorView.swift in Sources */, F41205292382AF5C009C2AC7 /* SPAlertIconAnimatable.swift in Sources */, + F4CA67B5238ABD0100E72F79 /* SPAlertIconAddView.swift in Sources */, F41204EB2382AC9B009C2AC7 /* SPAlertIconHeartView.swift in Sources */, F4A8361A2385588300EB32E0 /* SPAlertIconDocView.swift in Sources */, F412052B2382AF64009C2AC7 /* SPAlertLayout.swift in Sources */, diff --git a/Source/SPAlert/Models/SPAlertPreset.swift b/Source/SPAlert/Models/SPAlertPreset.swift index 51e8253..832c418 100644 --- a/Source/SPAlert/Models/SPAlertPreset.swift +++ b/Source/SPAlert/Models/SPAlertPreset.swift @@ -30,6 +30,7 @@ public enum SPAlertPreset { case heart case doc case bookmark + case add case error /** @@ -45,6 +46,8 @@ public enum SPAlertPreset { return SPAlertIconDocView() case .bookmark: return SPAlertIconBookmarkView() + case .add: + return SPAlertIconAddView() case .error: return SPAlertIconErrorView() } @@ -81,19 +84,27 @@ public enum SPAlertPreset { return layout case .bookmark: var layout = SPAlertLayout() - layout.topSpace = 51 + layout.topSpace = 57 layout.bottomSpace = 29 layout.iconWidth = 112 - layout.iconHeight = 77 - layout.bottomIconSpace = 35 + layout.iconHeight = 94 + layout.bottomIconSpace = 36 + return layout + case .add: + var layout = SPAlertLayout() + layout.topSpace = 63 + layout.bottomSpace = 29 + layout.iconWidth = 106 + layout.iconHeight = 106 + layout.bottomIconSpace = 39 return layout case .error: var layout = SPAlertLayout() layout.topSpace = 63 layout.bottomSpace = 29 - layout.iconWidth = 112 - layout.iconHeight = 112 - layout.bottomIconSpace = 35 + layout.iconWidth = 100 + layout.iconHeight = 100 + layout.bottomIconSpace = 37 return layout } } @@ -111,6 +122,8 @@ public enum SPAlertPreset { return .success case .bookmark: return .success + case .add: + return .success case .error: return .error } diff --git a/Source/SPAlert/Views/Icons/SPAlertIconAddView.swift b/Source/SPAlert/Views/Icons/SPAlertIconAddView.swift new file mode 100644 index 0000000..498691b --- /dev/null +++ b/Source/SPAlert/Views/Icons/SPAlertIconAddView.swift @@ -0,0 +1,84 @@ +// The MIT License (MIT) +// Copyright © 2019 Ivan Vorobei (ivanvorobei@icloud.com) +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +import UIKit + +public class SPAlertIconAddView: UIView, SPAlertIconAnimatable { + + public func animate() { + animateLeftToRightLine() + animateBottomFromTopLine() + } + + private func animateLeftToRightLine() { + let length = frame.width + + let topToBottomLine = UIBezierPath() + topToBottomLine.move(to: CGPoint(x: length * 0, y: length * 0.5)) + topToBottomLine.addLine(to: CGPoint(x: length * 1, y: length * 0.5)) + + let animatableLayer = CAShapeLayer() + animatableLayer.path = topToBottomLine.cgPath + animatableLayer.fillColor = UIColor.clear.cgColor + animatableLayer.strokeColor = tintColor?.cgColor + animatableLayer.lineWidth = 9 + animatableLayer.lineCap = .round + animatableLayer.lineJoin = .round + animatableLayer.strokeEnd = 0 + self.layer.addSublayer(animatableLayer) + + let animation = CABasicAnimation(keyPath: "strokeEnd") + animation.duration = 0.3 + animation.fromValue = 0 + animation.toValue = 1 + animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut) + + animatableLayer.strokeEnd = 1 + animatableLayer.add(animation, forKey: "animation") + } + + private func animateBottomFromTopLine() { + let length = frame.width + + let bottomToTopLine = UIBezierPath() + bottomToTopLine.move(to: CGPoint(x: length * 0.5, y: length * 1)) + bottomToTopLine.addLine(to: CGPoint(x: length * 0.5, y: length * 0)) + + let animatableLayer = CAShapeLayer() + animatableLayer.path = bottomToTopLine.cgPath + animatableLayer.fillColor = UIColor.clear.cgColor + animatableLayer.strokeColor = tintColor?.cgColor + animatableLayer.lineWidth = 9 + animatableLayer.lineCap = .round + animatableLayer.lineJoin = .round + animatableLayer.strokeEnd = 0 + self.layer.addSublayer(animatableLayer) + + let animation = CABasicAnimation(keyPath: "strokeEnd") + animation.duration = 0.3 + animation.fromValue = 0 + animation.toValue = 1 + animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut) + + animatableLayer.strokeEnd = 1 + animatableLayer.add(animation, forKey: "animation") + } +} diff --git a/Source/SPAlert/Views/Icons/SPAlertIconErrorView.swift b/Source/SPAlert/Views/Icons/SPAlertIconErrorView.swift index 018d80c..203771b 100644 --- a/Source/SPAlert/Views/Icons/SPAlertIconErrorView.swift +++ b/Source/SPAlert/Views/Icons/SPAlertIconErrorView.swift @@ -32,8 +32,8 @@ public class SPAlertIconErrorView: UIView, SPAlertIconAnimatable { let length = frame.width let topToBottomLine = UIBezierPath() - topToBottomLine.move(to: CGPoint(x: length * 0.1, y: length * 0.1)) - topToBottomLine.addLine(to: CGPoint(x: length * 0.9, y: length * 0.9)) + topToBottomLine.move(to: CGPoint(x: length * 0, y: length * 0)) + topToBottomLine.addLine(to: CGPoint(x: length * 1, y: length * 1)) let animatableLayer = CAShapeLayer() animatableLayer.path = topToBottomLine.cgPath @@ -46,7 +46,7 @@ public class SPAlertIconErrorView: UIView, SPAlertIconAnimatable { self.layer.addSublayer(animatableLayer) let animation = CABasicAnimation(keyPath: "strokeEnd") - animation.duration = 0.3 + animation.duration = 0.22 animation.fromValue = 0 animation.toValue = 1 animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut) @@ -59,8 +59,8 @@ public class SPAlertIconErrorView: UIView, SPAlertIconAnimatable { let length = frame.width let bottomToTopLine = UIBezierPath() - bottomToTopLine.move(to: CGPoint(x: length * 0.1, y: length * 0.9)) - bottomToTopLine.addLine(to: CGPoint(x: length * 0.9, y: length * 0.1)) + bottomToTopLine.move(to: CGPoint(x: length * 0, y: length * 1)) + bottomToTopLine.addLine(to: CGPoint(x: length * 1, y: length * 0)) let animatableLayer = CAShapeLayer() animatableLayer.path = bottomToTopLine.cgPath @@ -73,7 +73,7 @@ public class SPAlertIconErrorView: UIView, SPAlertIconAnimatable { self.layer.addSublayer(animatableLayer) let animation = CABasicAnimation(keyPath: "strokeEnd") - animation.duration = 0.3 + animation.duration = 0.22 animation.fromValue = 0 animation.toValue = 1 animation.timingFunction = CAMediaTimingFunction(name: .easeInEaseOut)