From 98e71d0159e3a9c1cac689a64ee57d0bfc670ee1 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 12 Sep 2015 19:58:32 +0100 Subject: [PATCH 001/194] update to Xcode 7 settings --- .../TwitterSearch.xcodeproj/project.pbxproj | 12 +++++++----- TwitterSearch/TwitterSearch/TwitterSearch-Info.plist | 2 +- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj b/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj index a5ebc07..fe8f663 100644 --- a/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj +++ b/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj @@ -160,7 +160,7 @@ 53CB80F0139D70FF0030ADD7 /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0420; + LastUpgradeCheck = 0700; }; buildConfigurationList = 53CB80F3139D70FF0030ADD7 /* Build configuration list for PBXProject "TwitterSearch" */; compatibilityVersion = "Xcode 3.2"; @@ -225,8 +225,8 @@ 53CB8118139D70FF0030ADD7 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = "compiler-default"; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = DEBUG; @@ -234,7 +234,8 @@ GCC_VERSION = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; }; name = Debug; @@ -242,13 +243,12 @@ 53CB8119139D70FF0030ADD7 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ARCHS = "$(ARCHS_STANDARD_32_BIT)"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; GCC_C_LANGUAGE_STANDARD = "compiler-default"; GCC_VERSION = ""; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; SDKROOT = iphoneos; }; @@ -266,6 +266,7 @@ GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "TwitterSearch/TwitterSearch-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; }; @@ -282,6 +283,7 @@ GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "TwitterSearch/TwitterSearch-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 6.0; + PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; VALIDATE_PRODUCT = YES; WRAPPER_EXTENSION = app; diff --git a/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist b/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist index 30d4e74..1e247e5 100644 --- a/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist +++ b/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist @@ -23,7 +23,7 @@ CFBundleIdentifier - com.useyourloaf.${PRODUCT_NAME:rfc1034identifier} + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName From 84f4a10628249dbe3ec6d084d03276ba5a91baa3 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 12 Sep 2015 21:06:05 +0100 Subject: [PATCH 002/194] Refresh for Xcode 7 Updated Xcode project settings for Xcode 7 Update Storyboard to use Autolayout and size classes Update to Asset catalogs and launch storyboard --- TwitterSearch/Default-568h@2x.png | Bin 6012 -> 0 bytes TwitterSearch/Default.png | Bin 1853 -> 0 bytes TwitterSearch/Default@2x.png | Bin 5485 -> 0 bytes TwitterSearch/Icon.png | Bin 5593 -> 0 bytes TwitterSearch/Icon@2x.png | Bin 7552 -> 0 bytes .../TwitterSearch.xcodeproj/project.pbxproj | 65 ++++++----- .../AppIcon.appiconset/Contents.json | 80 +++++++++++++ .../AppIcon.appiconset/Icon2-29.png | Bin 0 -> 365 bytes .../AppIcon.appiconset/Icon2-29@2x-1.png | Bin 0 -> 585 bytes .../AppIcon.appiconset/Icon2-29@2x.png | Bin 0 -> 585 bytes .../AppIcon.appiconset/Icon2-29@3x.png | Bin 0 -> 811 bytes .../AppIcon.appiconset/Icon2-40.png | Bin 0 -> 486 bytes .../AppIcon.appiconset/Icon2-40@2x-1.png | Bin 0 -> 812 bytes .../AppIcon.appiconset/Icon2-40@2x.png | Bin 0 -> 812 bytes .../AppIcon.appiconset/Icon2-76.png | Bin 0 -> 717 bytes .../AppIcon.appiconset/Icon2-76@2x.png | Bin 0 -> 1360 bytes .../AppIcon.appiconset/Icon@2x-1.png | Bin 0 -> 992 bytes .../AppIcon.appiconset/Icon@2x.png | Bin 0 -> 992 bytes .../AppIcon.appiconset/Icon@3x.png | Bin 0 -> 1370 bytes .../Images.xcassets/Contents.json | 6 + .../TwitterSearch/LaunchScreen.storyboard | 46 ++++++++ .../TwitterSearch/RootViewController.m | 8 +- .../TwitterSearch/SearchViewController.m | 17 +-- .../TwitterSearch/Storyboard.storyboard | 107 ++++++++---------- TwitterSearch/TwitterSearch/TweetCell.h | 40 +++++++ TwitterSearch/TwitterSearch/TweetCell.m | 40 +++++++ .../TwitterSearch/TwitterSearch-Info.plist | 33 +++--- .../TwitterSearch/TwitterSearch-Prefix.pch | 14 --- 28 files changed, 324 insertions(+), 132 deletions(-) delete mode 100644 TwitterSearch/Default-568h@2x.png delete mode 100644 TwitterSearch/Default.png delete mode 100644 TwitterSearch/Default@2x.png delete mode 100644 TwitterSearch/Icon.png delete mode 100644 TwitterSearch/Icon@2x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Contents.json create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x-1.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@3x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x-1.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76@2x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x-1.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@2x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon@3x.png create mode 100644 TwitterSearch/TwitterSearch/Images.xcassets/Contents.json create mode 100644 TwitterSearch/TwitterSearch/LaunchScreen.storyboard create mode 100644 TwitterSearch/TwitterSearch/TweetCell.h create mode 100644 TwitterSearch/TwitterSearch/TweetCell.m delete mode 100644 TwitterSearch/TwitterSearch/TwitterSearch-Prefix.pch diff --git a/TwitterSearch/Default-568h@2x.png b/TwitterSearch/Default-568h@2x.png deleted file mode 100644 index 613355750ec785f2f9a21995536334afff835e71..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6012 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 diff --git a/TwitterSearch/Default.png b/TwitterSearch/Default.png deleted file mode 100644 index 0bb331c7aad39dd47719a4e26b21cf9ea3f3ae04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1853 zcmbVNYfzeJ8YMQn*-7KhZl^YFqUlZ=V`~=MG-KS^5ly-p<7(7qP1EScXyYXoKh#9U zD_)48DBcw#R}ln7(F%OQ8%kOmFI5x-BM9C=K~bZkR*kw}`hWlQnR(wI?>x_$^PF>L z-uwVRFYA+MPQqX?Yww#Lw_&hj*Pt`=r+1*2`P&{zFql)rIwX!2 zo<$!R9se$qR>A3xBXAV3xRl}}FT48~W}b5YpZ0*3f;VMB3U$BcmKHd@Pz z)G~ffwSZE`$*yh-!%*W3xK#cN>@z_=?RhR)lvd6s(4Rkg$|N$|6N`9NTuDY{YZ0@3 zU{sM<)HtksMXYU4E^U5VBP?Wy)wA<+rsYz0XFd%C@a(kmmZ}EHi1O7VEOXYlOkr|J zjXl^Jp-eTY)i2~c6UZji{W3)ftK$i=;YndbDXTLwrkvoT7DdotIF726uy)| z7eCCRlbd=;4U)%&-020QN;?ySXUE`K{i6znT01(SjwNtV`Sp`C^XQVM=%>t-vgYqF zG`U(^$(7)#U_60SRM!!Tp`weM3TxYOWYL_-OyR$%;B@H>i=i3R^zxRn`mWfw2y?T> zrRdx`Adj71(MqY~&YR2wW8(#MF%nldqMTG}r>l8AgJa4^*xGDT+u+!E7>1Td19Qnj za+5S7hk?ptm)Cbk<9v* z{yhN{`TG0%`ulTx94;P?x&z4e%*?&RPclsk1^`DpIIP{$b-OgkhP~CQwwZ$oZAOaJ z%m&~-nfFrD`{Xt#!u>~HGU*CD&TVnv#LGZ zJ96PYG~d+E0^r^Uo!G10A0Gp&q(VV-G&WW4=6}|eeD$U# z$n~5oS3x_2IPL1pL7Y>oN@HM#Dus4chMvYV`ClWUeA)e&c2~m-TuJok|tpL#< zUtiy?2hKJw&NdGmRf+ka=-2d*_d_hZ7So&F#X10v={fT1IkHE%FK_NcaQ_-0;&5d{ z_V(5!ACwWY%aeD;E%;8Lu(99T8q%(uq+q)^aCnzEK3Gr`Zip}q?|*eywcFIS38{fV zWUS96AUZOYo|>SdpMJ8&LB~i6p#9kF;bHb9dpOl6@haqf;o_Aq+XRV`QQ^kH zdI0W^XpTxUPF>doB^^&XzJ0>#Xe8F^Eu#nk02pnzNs>V|49dfOaolW;u2>~D{22EQ7NdwaG^#DxgfU3XzKo5AP}o;lEVdQH%B5Fu*S+?J$c1w@l~KolAR`}BRa1YtoL z!*4Eb2jqdGLZ@lh#x?!M@Q~IP3by|*sfzm$btamYr~AmxF5`Sq^e9*bQUQYjFf0yg zMnonj4gen*7|6&NShL?TB|)BgczC4Strz+2oR<(G#bvGy3F4KDP@=<%_M%5@wZ#%) zbHsGtn>Ro1?(SPc#${n@)y9X1r;kCO%kQk2kGE&8{WjZwB>HRMo!?!R+cPC^ajuOX hP3XS(4e|e9fB%D?smnr+5Lj<}ygmIq_+N$Q{10-(@2LO) diff --git a/TwitterSearch/Default@2x.png b/TwitterSearch/Default@2x.png deleted file mode 100644 index 0d5eccda2ee1cc7fe528d7ce77bbd63cc3a4fea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5485 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 DfR5qu diff --git a/TwitterSearch/Icon@2x.png b/TwitterSearch/Icon@2x.png deleted file mode 100644 index 8e3ed048641e01b64571a2fa52801247fe52aac0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7552 zcmb_gWmuHm)*eb4QMv??t|29d?vRF|8HTPwx=TWENI^@x14J-}mRtbv^Su&%N%o*53D8dtZAdM(dFhAs#gz001CVQI^-axx4?oaL{kQ z0bO@F002B02RS({6*)NuEq9o$gR>0)piG$k!beYcfjoM$L%3t=E+Yf;F||J~!#i#p+2Cv+Nl#;0&!;w;pn4;i18>(_%4A+Cgk$ELrZa!G zD-6W8>CjWj1Rzh@W@gS_ssngQGc3k8S@NA@_!UU04r0Ed18`FMMc=p+Jv$e*&jI)r z+pWi9#;8~o-b2=cNd(fxS>bV>WWhuus~r zqTSy&n%l5H?^;;C7p#i{4f|i}AF=FB=E%TvjFz4EDuEs3fD$PrChqohrTrYFGDUKqy^tHEAa3f;u+ao2y zz==H8co89pl@Q8@tk_h+*-oVPUKW6$NKvg873^Uc2q5A%{%?o;b(^%IPbs0w8jT3?dYj@@XE~>)i2!mV~sS z0&W;f41kDGWnzpM7(B}84$_$QGLr9aT9EHOn)ee&H^6L|{}kq<@P}@&3#Rs`eF9LdWjf|=0n+;>W1e1%@7keNvIil#MA zIqC5_#;xdlNIE6?Ak|v55q!nU05WH#%8N*crW>eJY&^6j76>~JFS0_^6@ytTrMz(; z-pPvN?l-VZur#SntHXE?*%PNF8tSH6rF9E#p)}=p6{^N;zC90b58dq}Twyu#eZ#Rt zdKiAY$K#7t;Qda#5ZaJ?%L(*@U95??#+Xjwx9`7TU~*>CBc{gL#6d;e=@rxtE7kO5 zj3V~yH??A~i+?ZkMunE;(Q{IjC?*OWCiaZRFg+DVMl%)=OUM1^BVyJ{?vzH-=9<+^ zxeOM}x09u`QrK8XHC1U9WEUQZs&VtL++p>){JLH2@gMdoU1=7By zt&LPYuSjxA-AxN%)=ZgC^GUPd$z`>;AENrB_^Jh6yGOc5H>|MMAYXB%u@@AnqL5jT zYW37A(<;X5$*RzRHuIb0u;k{unq|`4weOgV?o-Ro6#2btY1C*G`(X2dmrhCe)#c3d z?SW(Zt&U?{8)h35BpZ?zNsVk6)w$KnYk4N1LsbNS4sVAid=uPgom`vz_^`&o{Q3=h z>N$riM_?*rs%W{97&@zxVBccAisbQg>2QQR`Eu2@VQTWx8gLWFj*+1&12#jq#f>jgiKiP3F9* z83*Hfw#*IBMDwev_e;2^C0{L8fU2OS4Pd*%M-3AsX30Dz!ZOXK&AL9anrc8W(4t2B zFkezTw<`Blmr|EW$Y}Qz!w1V}GFd&P`LX$3kQ_+i3iLsFQpGe!p>d)3pa}H!jJGB>mANn($%%DL-QI2cShKb_Eji#zH?q%<; z{UGs7v)V=S_DAiLCqyTVmn@fj*q~_N=nkUO_nzKt?GZtUJG)yeEfYuZHEh-Z*18#$ zlI3ip3HAxXi9&n=iZ2wi+?4Lqk5^h~-II8%dEgelZuztNA5+(icQ3{@=HoWK`(64M z--8xVEtj0P)ov##JsV0XdA>--NJi?sfcNSEs4*Mdl$QUX_qz>Ms|gOZ0!u##oZuSMTC*w+V>+e$%RuD@M5Vffv!(z7^nHF6)t5v2hI zgp!6rfI^yrS{j(ks9{|ZZVYEA29eX#kOeS#yO*85TU3i)+grt3JKzy8ebKP@!MzDt zHa1zEXwhTznByJ|J>4?#bqq;w8B)Fa*rL@3i8=qgJ^C_vbC7d0?#S%S<|+v@EuubR zT0X7cEC#AltwN@nh{m(V8ChmXY%Qmm0Eo2% z*e6)XE7vyafH=@6DUhB{QfKopvTaX~|Dpa}8P1f&{KN>q!LfeHPRS;BRD1l+#_@XQ zy6YI-$hVQpU?E!}A1}L3?;lZDJwgXgL{*V<)uta?ANiQ|w5@#a+)Z#{a8X|PGNw2d zXG62>8oM;Bou^&fX=&eZxG^Z(DyzNH!98I@ZEd zb!(4@V5raE?u#C+4xP~-<`76M_{9d5Z?mFuPhL+M#~SC)eVU7T z{pz7ZfO^34cIZqt-2@%CRMvIiG5jPWvtiUuZ8B+s>}8f{u21k+*}=%8XE7AfVuqfQ zZH?>iva4&Wm&U@pZaQ@7 z*mi3`y;!S?@5Bn)yfC{2E}gUmA>*&JX)vDMx;WtJ47fJ`1lkT-LQP|r-8PpR_ZLCg zqo8|h1*~|Q969AuRVc*Sylq*>@m}7%Wt{=wEj{@MR31HnSGl#s1^|({}-p}-3%$!rP5B(i@6h*P3x`o z86Stk;*!{Z>n{i|xkpX~efnelerqnO^Fjk;zN7>IFh4u!fjz+*>S9os3lGE^W@W?U>*DtF1PYMw6}x$KvGIg3 z__{c|dWiXg7=JOuZk~U_Kt_gN6i+7*BUnR=K@R3_!yv@N$HUJkiO0aeAmMIpE2bl_ z_^12L8;H@~)6-212=wvs;qejRfw|iO`9wuUfxP@cetzy72DgWwt0%;l+tuU2A3^>R zN8ZK*>h9p?=>T(O_!$>s1@rO*F*5#4^w;N)ae6w~{xg%S$Dh->nIQ0|1<1$43;Zkg zjjO~@R7}Ul1Lo}YGrYd5gQp~)#4qyS;eTfP!%Gh4;^uDS;c??8DfFky@7Uk@;D4r( z6z2ca;dk)w4w~)`HaCL&9M@lC`W^c_-{?Oj_#OPyK?3+w#NR~yRk5FH{0;yA#J2Hu z_+P~SY58}tf1+Yq4!$G27P@$riZ-mHqhaegb(Pm7$p4a5`Xt_OoTOa7{t%gMLi}2Jc19eB{s*$+s`*`C9}p} zm*SEZc&DE~2qSRf5*x0y1w-!>KbujnqM8Ha^sfr)Iz*_DO;E*l1@cIxY&>zwGOxs#d9ymrdDqj){AlZQDQelkp?@cQs-lK2pe*<* zvaJ}u2?{(htK0|8xNVPbJbUoQ%Ui zh39y(eCo-Ge>~LOd~bQ_waY@dLor0kz#Ppl5AiFhH!2Uy_I9M5}a%CYN|`> z`@Z2$7Egpjlp2pu!iV$C$vtpW-f87@O|sV=nyF9vmuS>H;vZDpiF zU0cE>un(*?H`AM>e9zvWWP}dfPJX!pPP98ns*E<>}nbDu-&sOpy6h9qvXE7&uUIn zvnQRa=ylIl=Tc_zcJ>-f4Drd^apwvOW$}s@Z#tU~5%+NZl;lzs|3q4gjh7Z60yh;k zGzj-o`eF2?C2Dwt1x{w_xN|`v)m~rR3G6Q2or)lo3i^B&?_g5`&q?EJ%>FvvEQwBI zRav&%erk8!g4(UYHYSTLI!7hEn+4=r)aG-68%Run_t@-|jg9`WC0ym!oL& ztcG=|upHV?BBujGxm#lI*4Ib1sD}BmOr4HTH&0z1L7g6>F9S}XN1tKl%bweTc6~8s z!g<7Ef={{!F|*%lsgjM27rPXaRi0v%pK_E86nN|k3u8U6kVEwA zeIsggLznuc%N=;!Bo~gL(#b^0>+~r5)fBapXLpJMNHT+KRyO2-Dg+hYWlcdt=_6)g zu9YDdKbG)?ICSLXLuFf;OH;#{sZq{GUMBN(gQ3yIWp-H~#Z*Okxfk?k_!Zmq64{SrM5LxhE__iZ#dnZN*{ymmYh6|;#>_x^M;0Rpe+ z)N2?fTxo3F!|EA$p1}B@=mZiypgV z8Ou*_B6@77H=S$0EMAZ|MyZXeBc_}nm=jrN`A)O7ruedh56zHp4G5_mlSMzERNOLH z<@dJcU^meZq(c*aGR{(H(DA;l_;ZkBSxxcgI2$IKoWbSfhpo1!8tEHhv$n`|-R1Wc zl8cR}y~?WvdQ`Y<+SMg_4p&c%Ih(lOc2kp?-j?ILJ3!rrIt+$YqAT3SVjdaZ;46~# z2-hETZ{;JIT+0ZpayZ$1q|>EJ&Xgb2ue~?@QU^ICkC6u_F3pitsVq5F4~CwD3fN9a zpd>!WZ@6MpVr0os#P^?m3D%45N-VObD{)!5zYmuJIrXBy93~hLujco}>%{v0w)p9Y zgqI$p7mz`va_IGhSX z9@JBvx_{f3)NyE4)9&66IU~o>uzkq^x6Wjj5r{#h3?TakL?JqgP9C z-0Qg3bk8GgFi4rjF$K}tpT^ptvkNFe^5g7P`o9pR75fTOm$se*^*|$HhMHif7*R2 zBcjgncA2g-SZkx!)J`I?HOe|Q@{v}p(~hc|!4=>5ai3aKMc2{$m~36z5{oE6cXHLL zPU32W7*cVno?fsOjfN$LjBX~02!lc;&$qUJJ8M^UOkTPcowf2Z__TNZBN4X$?6UaR z8chlRy|)f;b`cw7Lehyk1JPr+_FjGwGe1fZAzGgj}rR4w%F1y>4#?CL# z(mosnDY=`658*iF_#b~c*^XZWsYsikdZ!+x##73MzbCB-)a22n%o$>1t%xSo!e zdFqf=+O`$CQDN$Jm7881bxIylE8J`v1%go1OQZuiQiMbP&5yMS&y#gZ zzlygah?U&phd)y1ao=Rxun9P5Au^?p{<{lE$D?SJp?l@9nCCJ6{2>T0tB$Met@N9V zZEdvNG9OwTy@hY5CSoTVQ^FrNu$o|Jh4l{`+3I)&)SGD8RTD3YjFWI*9$qxWl<5P7 zrZQ@Sj~*1ne2c$z;kDIdKosH!DtavK>6kL=r)pI?s!Pvg_4#t;-Tg^AO`Kum-9hTl z$ioswMazN7a&!cdi>r_h@)^lDe(eH|*(!A^H0!1Lu$tQ)>dFH~$7^lhbLY8fW0S0j zTVCu|<98hPc3iifD($|Z2W!X3DH!l+jKtyv5^Bi8)ryNX9fpj>53E9iVLlyZ%8!@Q zR%-MKgmBADl^5QZhovelChlzRG-GU1dp`UQ9*U~Xser<4meK~gPUvRYWb&9Kvrlby z=DBpmHO@sZ_GRPB>Eu|xT2jLq_wIt*a}gWV|4~$R>&V65^#LZZdi80iiuMZF+nI)6m~M#=p|4`)rV0rwW5(i zS)lnhEdF@rPLH^5!^00*Ga z&n9jpm4Qf|TGw89)6ukwS>CA|i`YM7&HeQLwQot5{#wzYL`wjQ*3dte>_JX`H>-YJ zdDv^jNHN_m8GGUb%FzU_M)Z2Ir91i<8m1RvU%?Hop0VG#ro{~-%Pr81?|6$E>bvSk ziJR87O_h(2feyO|zYIF2>txCJ5q;WkNhlV3-L@N6p*@Ay7N|kCuu^UyNpcKwK|7T` zaa@-78r7{bU;tlt44u12!T{$lBI)^B63J4YVxa4>vbXM+6SbmE@=MI(xxFgYtl+qW z%8z23Db`jxmj~!;2-Pr{JNa4?3TUa1iUkTDB}1O*+xh!|%AG9+Z|?G7X7e zt4&5lPCv@IW8@*gTdSv;dI;6a6l8QhF*9NsHlP|iI{)Gv#t>JMAFdF@yBqVF0tuA=7G%E1mpcY|*7N(D4Hh#{Ws@~K&SNSN@yi$I9P+RRq z{}oz~?ALC6^roST4o%=3FK*wXAN>F&P>POFqF0th)u$@r=p@HV)&3eI1-JcI)g88t zZn|-Z+k6B*mc%M(hzjakV3ZrSVn$Bk2=M4#A7d})NUb8yj7KWuJ6PV{2K*pmyLGhI zpNp}Pzw%D+v8fFhM1IGZY7PhDU(H{6?-@=Nfl~x8$dJk)K_S8*N=P<6r-Gnjh*6fa gkNUp)B;p#dYbZ4r1sKHn`L~ve!Xx==SH~;_u diff --git a/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj b/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj index fe8f663..50360bb 100644 --- a/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj +++ b/TwitterSearch/TwitterSearch.xcodeproj/project.pbxproj @@ -3,11 +3,14 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 47; objects = { /* Begin PBXBuildFile section */ 53432FE8176E71DF0015F986 /* Storyboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53432FE7176E71DF0015F986 /* Storyboard.storyboard */; }; + 536348091BA4AD6A005B59F3 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 536348081BA4AD6A005B59F3 /* Images.xcassets */; settings = {ASSET_TAGS = (); }; }; + 5363480B1BA4B3C6005B59F3 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5363480A1BA4B3C6005B59F3 /* LaunchScreen.storyboard */; settings = {ASSET_TAGS = (); }; }; + 5363480E1BA4BB37005B59F3 /* TweetCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 5363480D1BA4BB37005B59F3 /* TweetCell.m */; settings = {ASSET_TAGS = (); }; }; 53852EDA176B9A6900EC1107 /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53852ED9176B9A6900EC1107 /* Social.framework */; }; 53852EDC176BA6DA00EC1107 /* Accounts.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53852EDB176BA6DA00EC1107 /* Accounts.framework */; }; 53CB80FE139D70FF0030ADD7 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53CB80FD139D70FF0030ADD7 /* UIKit.framework */; }; @@ -18,15 +21,14 @@ 53CB810E139D70FF0030ADD7 /* TwitterSearchAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 53CB810D139D70FF0030ADD7 /* TwitterSearchAppDelegate.m */; }; 53CB8114139D70FF0030ADD7 /* RootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53CB8113139D70FF0030ADD7 /* RootViewController.m */; }; 53CB812B139D73810030ADD7 /* SearchViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 53CB812A139D73810030ADD7 /* SearchViewController.m */; }; - 53D3D83B1763BBA9001E5C7C /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53D3D83A1763BBA9001E5C7C /* Default-568h@2x.png */; }; - 53D3D83D1763C22C001E5C7C /* Icon.png in Resources */ = {isa = PBXBuildFile; fileRef = 53D3D83C1763C22C001E5C7C /* Icon.png */; }; - 53D3D83F1763C232001E5C7C /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53D3D83E1763C232001E5C7C /* Icon@2x.png */; }; - 53D3D8411763C238001E5C7C /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 53D3D8401763C238001E5C7C /* Default.png */; }; - 53D3D8431763C23C001E5C7C /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 53D3D8421763C23C001E5C7C /* Default@2x.png */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ 53432FE7176E71DF0015F986 /* Storyboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Storyboard.storyboard; sourceTree = ""; }; + 536348081BA4AD6A005B59F3 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 5363480A1BA4B3C6005B59F3 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; + 5363480C1BA4BB37005B59F3 /* TweetCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TweetCell.h; sourceTree = ""; }; + 5363480D1BA4BB37005B59F3 /* TweetCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TweetCell.m; sourceTree = ""; }; 53852ED9176B9A6900EC1107 /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; }; 53852EDB176BA6DA00EC1107 /* Accounts.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accounts.framework; path = System/Library/Frameworks/Accounts.framework; sourceTree = SDKROOT; }; 53CB80F9139D70FF0030ADD7 /* TwitterSearch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TwitterSearch.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -35,7 +37,6 @@ 53CB8101139D70FF0030ADD7 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 53CB8105139D70FF0030ADD7 /* TwitterSearch-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TwitterSearch-Info.plist"; sourceTree = ""; }; 53CB8107139D70FF0030ADD7 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 53CB8109139D70FF0030ADD7 /* TwitterSearch-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TwitterSearch-Prefix.pch"; sourceTree = ""; }; 53CB810A139D70FF0030ADD7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 53CB810C139D70FF0030ADD7 /* TwitterSearchAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TwitterSearchAppDelegate.h; sourceTree = ""; }; 53CB810D139D70FF0030ADD7 /* TwitterSearchAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TwitterSearchAppDelegate.m; sourceTree = ""; }; @@ -43,11 +44,6 @@ 53CB8113139D70FF0030ADD7 /* RootViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RootViewController.m; sourceTree = ""; }; 53CB8129139D73800030ADD7 /* SearchViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SearchViewController.h; sourceTree = ""; }; 53CB812A139D73810030ADD7 /* SearchViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SearchViewController.m; sourceTree = ""; }; - 53D3D83A1763BBA9001E5C7C /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-568h@2x.png"; path = "../Default-568h@2x.png"; sourceTree = ""; }; - 53D3D83C1763C22C001E5C7C /* Icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Icon.png; path = ../Icon.png; sourceTree = ""; }; - 53D3D83E1763C232001E5C7C /* Icon@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Icon@2x.png"; path = "../Icon@2x.png"; sourceTree = ""; }; - 53D3D8401763C238001E5C7C /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = ../Default.png; sourceTree = ""; }; - 53D3D8421763C23C001E5C7C /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default@2x.png"; path = "../Default@2x.png"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -104,7 +100,10 @@ 53CB8113139D70FF0030ADD7 /* RootViewController.m */, 53CB8129139D73800030ADD7 /* SearchViewController.h */, 53CB812A139D73810030ADD7 /* SearchViewController.m */, + 5363480C1BA4BB37005B59F3 /* TweetCell.h */, + 5363480D1BA4BB37005B59F3 /* TweetCell.m */, 53CB815C139D75DB0030ADD7 /* Resources */, + 536348081BA4AD6A005B59F3 /* Images.xcassets */, 53CB8104139D70FF0030ADD7 /* Supporting Files */, ); path = TwitterSearch; @@ -115,7 +114,6 @@ children = ( 53CB8105139D70FF0030ADD7 /* TwitterSearch-Info.plist */, 53CB8106139D70FF0030ADD7 /* InfoPlist.strings */, - 53CB8109139D70FF0030ADD7 /* TwitterSearch-Prefix.pch */, 53CB810A139D70FF0030ADD7 /* main.m */, ); name = "Supporting Files"; @@ -124,12 +122,8 @@ 53CB815C139D75DB0030ADD7 /* Resources */ = { isa = PBXGroup; children = ( - 53D3D8421763C23C001E5C7C /* Default@2x.png */, - 53D3D8401763C238001E5C7C /* Default.png */, - 53D3D83E1763C232001E5C7C /* Icon@2x.png */, - 53D3D83C1763C22C001E5C7C /* Icon.png */, - 53D3D83A1763BBA9001E5C7C /* Default-568h@2x.png */, 53432FE7176E71DF0015F986 /* Storyboard.storyboard */, + 5363480A1BA4B3C6005B59F3 /* LaunchScreen.storyboard */, ); name = Resources; sourceTree = ""; @@ -161,9 +155,14 @@ isa = PBXProject; attributes = { LastUpgradeCheck = 0700; + TargetAttributes = { + 53CB80F8139D70FF0030ADD7 = { + DevelopmentTeam = LCC2J94N44; + }; + }; }; buildConfigurationList = 53CB80F3139D70FF0030ADD7 /* Build configuration list for PBXProject "TwitterSearch" */; - compatibilityVersion = "Xcode 3.2"; + compatibilityVersion = "Xcode 6.3"; developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( @@ -185,11 +184,8 @@ buildActionMask = 2147483647; files = ( 53CB8108139D70FF0030ADD7 /* InfoPlist.strings in Resources */, - 53D3D83B1763BBA9001E5C7C /* Default-568h@2x.png in Resources */, - 53D3D83D1763C22C001E5C7C /* Icon.png in Resources */, - 53D3D83F1763C232001E5C7C /* Icon@2x.png in Resources */, - 53D3D8411763C238001E5C7C /* Default.png in Resources */, - 53D3D8431763C23C001E5C7C /* Default@2x.png in Resources */, + 5363480B1BA4B3C6005B59F3 /* LaunchScreen.storyboard in Resources */, + 536348091BA4AD6A005B59F3 /* Images.xcassets in Resources */, 53432FE8176E71DF0015F986 /* Storyboard.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -204,6 +200,7 @@ 53CB810B139D70FF0030ADD7 /* main.m in Sources */, 53CB810E139D70FF0030ADD7 /* TwitterSearchAppDelegate.m in Sources */, 53CB8114139D70FF0030ADD7 /* RootViewController.m in Sources */, + 5363480E1BA4BB37005B59F3 /* TweetCell.m in Sources */, 53CB812B139D73810030ADD7 /* SearchViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -258,16 +255,20 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "TwitterSearch/TwitterSearch-Prefix.pch"; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "TwitterSearch/TwitterSearch-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; WRAPPER_EXTENSION = app; }; name = Debug; @@ -276,15 +277,19 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; COPY_PHASE_STRIP = YES; - GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "TwitterSearch/TwitterSearch-Prefix.pch"; + GCC_PRECOMPILE_PREFIX_HEADER = NO; + GCC_PREFIX_HEADER = ""; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INFOPLIST_FILE = "TwitterSearch/TwitterSearch-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 6.0; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; + TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; WRAPPER_EXTENSION = app; }; diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Contents.json b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..8595f0a --- /dev/null +++ b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,80 @@ +{ + "images" : [ + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon2-29@2x-1.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "Icon2-29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon2-40@2x-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "Icon@2x-1.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "Icon@3x.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon2-29.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "Icon2-29@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon2-40.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "Icon2-40@2x.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon2-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "Icon2-76@2x.png", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29.png new file mode 100644 index 0000000000000000000000000000000000000000..bc5e803416f2d62ba420492964041342e944c1e7 GIT binary patch literal 365 zcmV-z0h0cSP)m{QZUX?+>PxzNK)%Ifm_j zzOn+1K2#q_5_L;=mcv(Xk@ENS1drRB4X-S=rn0%uPAUPz7g(4LE^|lg%~5j!?Y&pg%FrJU00000 LNkvXXu0mjf=#Zv% literal 0 HcmV?d00001 diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x-1.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..532cc4fba46360ccae7099da9b042350d4197f7a GIT binary patch literal 585 zcmV-P0=E5$P)LqC6C#!GyeJk`tk;=QF6U?TFsV3l_ZdrBa!y$4cM(U-M22IKz*-R zZTRj9rA2$NT5O{~e*O3Z@!k{f+7|8C7|M=Gq(gk(xGkA0i>OO>_2>=b!zRs@M5ac0 zymVX3l1BUU2AM32(3?TwzA43pQ0dMdw`gLUFNwf=R`=@*<;El5yDRqU47h4x?baFa z-4(}*Ow^=0{PhL4XJh5ZBlF`Cnl6c+H-yrlJ>tP9`S1v#J%HS`Ft}`B+ORUqkVx05 zH_w_u&X+^7UummQbJ3nY>(d+Jz$mR%aQ*lK+_W&kepJw#K%hE-r$~6if>E$pY?>{K z!apQ$0002|NklS-1qQ($*U#W#t;Uk(Dx#mz5F_mX+H;AW+cPaX(x2C>v3#X57@}`WBu6 XHwzNK^Vmv800000NkvXXu0mjfot_sb literal 0 HcmV?d00001 diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..532cc4fba46360ccae7099da9b042350d4197f7a GIT binary patch literal 585 zcmV-P0=E5$P)LqC6C#!GyeJk`tk;=QF6U?TFsV3l_ZdrBa!y$4cM(U-M22IKz*-R zZTRj9rA2$NT5O{~e*O3Z@!k{f+7|8C7|M=Gq(gk(xGkA0i>OO>_2>=b!zRs@M5ac0 zymVX3l1BUU2AM32(3?TwzA43pQ0dMdw`gLUFNwf=R`=@*<;El5yDRqU47h4x?baFa z-4(}*Ow^=0{PhL4XJh5ZBlF`Cnl6c+H-yrlJ>tP9`S1v#J%HS`Ft}`B+ORUqkVx05 zH_w_u&X+^7UummQbJ3nY>(d+Jz$mR%aQ*lK+_W&kepJw#K%hE-r$~6if>E$pY?>{K z!apQ$0002|NklS-1qQ($*U#W#t;Uk(Dx#mz5F_mX+H;AW+cPaX(x2C>v3#X57@}`WBu6 XHwzNK^Vmv800000NkvXXu0mjfot_sb literal 0 HcmV?d00001 diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@3x.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-29@3x.png new file mode 100644 index 0000000000000000000000000000000000000000..d828562470fa9574051a7fa215bc075d387c6cc9 GIT binary patch literal 811 zcmV+`1JwM9P) zuUKvB&>fg5jkIHC?A02%ZD7%!KAbX##)wV*_yWw7MaYaxpE!cmra7cTeC^j5)~Pt& zxh=M5W81PZ^yLrj))}5Ph3e59#Dq|qE{X5l761DIqCbD%yerb6J=CN+`}75sBaygj zVe8TxmL-qdvoX`6Ji2dQ?${T`h)%tATJ`4+u2^oEDvZsQM6_aNnJbI+=nb4PhrxbS z_UR3tH-xunV&%mo`0fdrD~!>dKhBp!w`pSX;S#lFWwT&t!+}z;TWigfMZbDi`tb+% z>CPUeM|uAF0+%O_@ZJ>5l18IHe&)#{zIIvk zt%da~PFZMb`Rnj&7tH_lSE&cj)a zDvNK$E>e}@DpsY~lEZhlEl_NStKr3Q)da<^-EcHOG1x>%kE#eq`za0}Y=mkUjt)^A zMp%hz9FC4s%pmL-)l)cXQDhKylIj%P*X(^WFW%v=;!ULj pAFTH>kc0uh*YEwid7kHa9|5%qB?}*Z_C){y002ovPDHLkV1mwNkLv&c literal 0 HcmV?d00001 diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40.png new file mode 100644 index 0000000000000000000000000000000000000000..60a35d268575817e77853e909832a2b4318ca0c4 GIT binary patch literal 486 zcmV@P)N_Utkjm(rqr9^wlk4f#;8T#@D`0fe&^aY+agx9Jz z`|}2>PIS|vJkXp#u2*ipc3GDvj@qv?@7fm8oj?Bh0^-3Z(3?Tkr8@HA5~fCa>(d+k z_yV9hf%D`L)~Pt0F^KHc8t>c{nJkN%E{W>U9p}j*^WzcSwl2tvOtoZX=*=I^lts>% zLfNk~$BIm}V`i*VasT@PTCk!Y0002JNkl^|Py6SINFHehRHE-k(fY`AW?M~0w)Gb80)DSwAR%sB2YApgjgWp_@ ztPkx#>oU;mujkJ%jI?kJlW@B*(?SO_;a5kixKALV1m)oTLg1`R zxDvSQ8@RnQyZZ<5Qf3!C!c$tAdx4n5S#fw3KJ%s|y~BqHenLV7zZ~aV?W82&O5xrP c;I{p@1pnL&fLS3QCIA2c07*qoM6N<$f|=~;Q~&?~ literal 0 HcmV?d00001 diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x-1.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-40@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..54bc03a6aff5161ebf4b7b9d1913ac685c073b33 GIT binary patch literal 812 zcmV+{1JnG8P)gg6X2yt3?A02%ZD7%!KAbX#vteib_yWw7MaYaxpE!cmra7cTeC^j5)~Pt& zxh=M5W81PZ^yLrj))}5Ph3e59#Dq|qE{X5l761DIqCbD%yerb6J=CN+`}75sBaygj zVe8TxmL-qdvoX`6Ji2dQ?${T`h)%tATJ`4+u2^oEDvZsQM6_aNnJbI+=nb4PhrxbS z_UR3tH-xunV&%mo`0fdrD~!>dKhBp!w`pSX;S#lFWwT&t!+}z;TWigfMZbDi`tb+% z>CPUeM|uAF0+%O_@ZJ>5l18IHe&)#{zIIvkNq(zV<&6dwr$(~^NR{kJa2kE_xF0PZdjIO zITVjgtlYDA#kK>JP;e-?J|Pw3Gpo?24M|yIY+Vt3@Xtw;O({6GWvjH{%fq4V)pvIe zZeHt_ih)Hqvr$S8J}d&5T5~iaC4;kY;)Il}UO?IDGs}f$;K1AS+`30l=c3T`Wtf`~ z3ZkCts?Z3GxyHHN5yBF?N>A^GvC-xODJ?(j+YeJ=4kJ@&FfTL&Q-`@bf<{rHQJ6Z$ z-ElM;7D~a?N$&D!bV}$YOignaK%=ul=U^!0p$lmAp1n&@lVl3q64nkM6&S z3C)F|BmR`VXMQMoF7yIgyzIS#7FUA7D6~upy@r+mdv6w?Wf_C-pd8Ho!NCvNA3nkQ qb7XuaU(|w9;|l;w1xCbc0?10000gg6X2yt3?A02%ZD7%!KAbX#vteib_yWw7MaYaxpE!cmra7cTeC^j5)~Pt& zxh=M5W81PZ^yLrj))}5Ph3e59#Dq|qE{X5l761DIqCbD%yerb6J=CN+`}75sBaygj zVe8TxmL-qdvoX`6Ji2dQ?${T`h)%tATJ`4+u2^oEDvZsQM6_aNnJbI+=nb4PhrxbS z_UR3tH-xunV&%mo`0fdrD~!>dKhBp!w`pSX;S#lFWwT&t!+}z;TWigfMZbDi`tb+% z>CPUeM|uAF0+%O_@ZJ>5l18IHe&)#{zIIvkNq(zV<&6dwr$(~^NR{kJa2kE_xF0PZdjIO zITVjgtlYDA#kK>JP;e-?J|Pw3Gpo?24M|yIY+Vt3@Xtw;O({6GWvjH{%fq4V)pvIe zZeHt_ih)Hqvr$S8J}d&5T5~iaC4;kY;)Il}UO?IDGs}f$;K1AS+`30l=c3T`Wtf`~ z3ZkCts?Z3GxyHHN5yBF?N>A^GvC-xODJ?(j+YeJ=4kJ@&FfTL&Q-`@bf<{rHQJ6Z$ z-ElM;7D~a?N$&D!bV}$YOignaK%=ul=U^!0p$lmAp1n&@lVl3q64nkM6&S z3C)F|BmR`VXMQMoF7yIgyzIS#7FUA7D6~upy@r+mdv6w?Wf_C-pd8Ho!NCvNA3nkQ qb7XuaU(|w9;|l;w1xCbc0?10000@&?0!QqrG3lp>L>RdAXuit5lEo;QTsvN7ewB%e5f@ZJ={e^k+( zKb0eqvR-NV?+KYKi`vJIXVYOss*sV3RVrKmH1(zp|*sL|}*BGQie6Cn- z^5PMqKY#Jw6R=xrnJbH*ID`4{2-&YQ(x5%fltumc1LMOcp*w-ln?T&PFuHGE$BIn! zKYrf1Ev-~=l_ZecvoZYk1h86c zsZDkJ^aZh8YSyVZoim2qv@okua^}b)(3?T-*%#-_ApG|O)1o~0>kG4BXrexU;=(8I z+7_cgeTXO8>i_@&M@d9MRCodH(u2}nK@bGs?rYnOZJWPi+s^wxK(^y^Q`&Q;QrfSK z@xWLR1i|)Zt6Do)-FNl`5=!MZ^S5#lNsJqe*jqS%d#riU1|@1bmaj34@g8RZ#b*hHy4$8RH2I`Fo1fa)uSzZ{`V;B7x8dc4Yz&WAR9 zmFXOxBjO9?D?HuK&^d{yQ3e-1HtZ@3gSs zDxKjR7D~%>8ZeQktiZx*hR)hL3~XGZT!(=hpDE=Ol1ts9bnhU!{#{D;9+JENfb#GW zk}GVYJb4NOX-al03{<*wGE-Q1LCL|wOUf&lcugt7#2Y$qVWRzx&U=`sQ<^Zbg)+5F z_7NsN?GTUe4+^_~D8Rrj{!j|ZLbCrP2!h}n&_x|c;KSfJ00000NkvXXu0mjf{%2i4 literal 0 HcmV?d00001 diff --git a/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76@2x.png b/TwitterSearch/TwitterSearch/Images.xcassets/AppIcon.appiconset/Icon2-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ed4d62012833e2b0dd7a7f4f9411cbd7cd00d098 GIT binary patch literal 1360 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/TwitterSearch/TwitterSearch/RootViewController.m b/TwitterSearch/TwitterSearch/RootViewController.m index 552e74b..9df71dd 100644 --- a/TwitterSearch/TwitterSearch/RootViewController.m +++ b/TwitterSearch/TwitterSearch/RootViewController.m @@ -1,7 +1,7 @@ // // RootViewController.m // Created by Keith Harrison on 06-June-2011 http://useyourloaf.com -// Copyright (c) 2011 Keith Harrison. All rights reserved. +// Copyright (c) 2011-2015 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -33,12 +33,6 @@ @implementation RootViewController - -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; -} - #pragma mark - #pragma mark === Text field delegate methods === #pragma mark - diff --git a/TwitterSearch/TwitterSearch/SearchViewController.m b/TwitterSearch/TwitterSearch/SearchViewController.m index d28744e..c4811ae 100644 --- a/TwitterSearch/TwitterSearch/SearchViewController.m +++ b/TwitterSearch/TwitterSearch/SearchViewController.m @@ -1,7 +1,7 @@ // // SearchViewController.m // Created by Keith Harrison on 06-June-2011 http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2015 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -29,6 +29,7 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #import "SearchViewController.h" +#import "TweetCell.h" #import #import @@ -94,6 +95,9 @@ - (void)viewDidLoad { [super viewDidLoad]; + self.tableView.estimatedRowHeight = 84; + self.tableView.rowHeight = UITableViewAutomaticDimension; + // Add the target action to the refresh control as it seems not to take // effect when set in the storyboard. @@ -114,11 +118,6 @@ - (void)dealloc [self cancelConnection]; } -- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - return YES; -} - #pragma mark - #pragma mark === UITableViewDataSource Delegates === #pragma mark - @@ -144,12 +143,14 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:LoadCellIdentifier]; cell.textLabel.text = [self searchMessageForState:self.searchState]; + cell.textLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; return cell; } - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ResultCellIdentifier]; + TweetCell *cell = [tableView dequeueReusableCellWithIdentifier:ResultCellIdentifier]; NSDictionary *tweet = (self.results)[indexPath.row]; - cell.textLabel.text = tweet[@"text"]; + cell.tweetMessage.text = tweet[@"text"]; + cell.tweetMessage.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; return cell; } diff --git a/TwitterSearch/TwitterSearch/Storyboard.storyboard b/TwitterSearch/TwitterSearch/Storyboard.storyboard index e972cdd..e6f596e 100644 --- a/TwitterSearch/TwitterSearch/Storyboard.storyboard +++ b/TwitterSearch/TwitterSearch/Storyboard.storyboard @@ -1,7 +1,9 @@ - + - + + + @@ -17,21 +19,23 @@ - + - + + + + + - + - - - - + + @@ -40,62 +44,70 @@ - - - + + + - + - + - - + + - + - - + + - - - + - - + + - - + + - - - + + + + + + + + + + @@ -121,26 +133,7 @@ - + - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + diff --git a/TwitterSearch/TwitterSearch/TweetCell.h b/TwitterSearch/TwitterSearch/TweetCell.h new file mode 100644 index 0000000..58da243 --- /dev/null +++ b/TwitterSearch/TwitterSearch/TweetCell.h @@ -0,0 +1,40 @@ +// +// TweetCell.h +// TwitterSearch +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import + +@interface TweetCell : UITableViewCell +@property (weak, nonatomic) IBOutlet UILabel *tweetMessage; + +@end diff --git a/TwitterSearch/TwitterSearch/TweetCell.m b/TwitterSearch/TwitterSearch/TweetCell.m new file mode 100644 index 0000000..d13b327 --- /dev/null +++ b/TwitterSearch/TwitterSearch/TweetCell.m @@ -0,0 +1,40 @@ +// +// TweetCell.m +// TwitterSearch +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + + +#import "TweetCell.h" + +@implementation TweetCell + + +@end diff --git a/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist b/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist index 1e247e5..daddcd6 100644 --- a/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist +++ b/TwitterSearch/TwitterSearch/TwitterSearch-Info.plist @@ -8,20 +8,6 @@ ${PRODUCT_NAME} CFBundleExecutable ${EXECUTABLE_NAME} - CFBundleIconFile - - CFBundleIcons - - CFBundlePrimaryIcon - - CFBundleIconFiles - - - Icon.png - Icon@2x.png - - - CFBundleIdentifier $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion @@ -31,15 +17,30 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 2.0 CFBundleSignature ???? CFBundleVersion - 1.0 + 2.0 + LSApplicationCategoryType + LSRequiresIPhoneOS + UILaunchStoryboardName + LaunchScreen UIMainStoryboardFile Storyboard + NSAppTransportSecurity + + NSExceptionDomains + + api.twitter.com + + NSThirdPartyExceptionAllowsInsecureHTTPLoads + + + + UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/TwitterSearch/TwitterSearch/TwitterSearch-Prefix.pch b/TwitterSearch/TwitterSearch/TwitterSearch-Prefix.pch deleted file mode 100644 index 3347aac..0000000 --- a/TwitterSearch/TwitterSearch/TwitterSearch-Prefix.pch +++ /dev/null @@ -1,14 +0,0 @@ -// -// Prefix header for all source files of the 'TwitterSearch' target in the 'TwitterSearch' project -// - -#import - -#ifndef __IPHONE_3_0 -#warning "This project uses features only available in iPhone SDK 3.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif From b4457915e6762b387480f10fabbca7173f82fbc8 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 12 Sep 2015 21:11:37 +0100 Subject: [PATCH 003/194] Remove refeshControl workaround --- TwitterSearch/TwitterSearch/SearchViewController.m | 6 ------ 1 file changed, 6 deletions(-) diff --git a/TwitterSearch/TwitterSearch/SearchViewController.m b/TwitterSearch/TwitterSearch/SearchViewController.m index c4811ae..d3f5f61 100644 --- a/TwitterSearch/TwitterSearch/SearchViewController.m +++ b/TwitterSearch/TwitterSearch/SearchViewController.m @@ -97,12 +97,6 @@ - (void)viewDidLoad self.tableView.estimatedRowHeight = 84; self.tableView.rowHeight = UITableViewAutomaticDimension; - - // Add the target action to the refresh control as it seems not to take - // effect when set in the storyboard. - - [self.refreshControl addTarget:self action:@selector(refreshSearchResults) forControlEvents:UIControlEventValueChanged]; - self.title = self.query; [self loadQuery]; } From 241a67d029b671dfa60f8d8af7bfb3798ef3784c Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 14 Sep 2015 17:32:50 +0100 Subject: [PATCH 004/194] Remove old icon files --- TwitterSearch/Icon-Small.png | Bin 4596 -> 0 bytes TwitterSearch/Icon-Small@2x.png | Bin 5606 -> 0 bytes 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 TwitterSearch/Icon-Small.png delete mode 100644 TwitterSearch/Icon-Small@2x.png diff --git a/TwitterSearch/Icon-Small.png b/TwitterSearch/Icon-Small.png deleted file mode 100644 index 154885ac90f98dfdf41de6f59afea7e182334576..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4596 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 diff --git a/TwitterSearch/Icon-Small@2x.png b/TwitterSearch/Icon-Small@2x.png deleted file mode 100644 index 72974991c4b2ef6837430ca1f1e86393e8c2fd18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5606 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 PpJxpf9p&m9<{|$BZDioO From 6f1293c73e581b4a56132c43d8d79abad3e46473 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sun, 27 Sep 2015 18:57:16 +0100 Subject: [PATCH 005/194] Add example of hiding a view on compact size class --- Stacks/README | 11 +++- Stacks/Stacks.xcodeproj/project.pbxproj | 6 +++ Stacks/Stacks/Base.lproj/Main.storyboard | 65 ++++++++++++++++++++---- Stacks/Stacks/HiddenViewController.swift | 56 ++++++++++++++++++++ 4 files changed, 125 insertions(+), 13 deletions(-) create mode 100644 Stacks/Stacks/HiddenViewController.swift diff --git a/Stacks/README b/Stacks/README index c6678ad..bb82643 100644 --- a/Stacks/README +++ b/Stacks/README @@ -1,6 +1,7 @@ ======================================================================= Stacks - Using stack views (requires iOS 9) +Version 1.2 27 Sep 2015 Hide a view for compact height Version 1.1 06 July 2015 Adapting axis to view size classes Version 1.0 22 June 2015 Initial version. ======================================================================= @@ -8,9 +9,15 @@ Version 1.0 22 June 2015 Initial version. Example of how to use UIStackView to simplify layout of horizontal and vertical arrangements of views. See the following post for details: -http://useyourloaf.com/blog/2015/06/21/easier-autolayout-with-stackviews.html +http://useyourloaf.com/blog/easier-autolayout-with-stackviews.html Also see this post for details on how to have the stack view automatically adapt to size class changes: -http://useyourloaf.com/blog/2015/07/06/adapting-stack-views-with-size-classes.html +http://useyourloaf.com/blog/adapting-stack-views-with-size-classes.html + +The third view controller - HiddenViewController is an example of how to +use size classes to hide a view contained in a stack view. See this post +for details: + +http://useyourloaf.com/blog/using-size-classes-to-hide-stack-view-contents.html \ No newline at end of file diff --git a/Stacks/Stacks.xcodeproj/project.pbxproj b/Stacks/Stacks.xcodeproj/project.pbxproj index c2d52c2..611f92e 100644 --- a/Stacks/Stacks.xcodeproj/project.pbxproj +++ b/Stacks/Stacks.xcodeproj/project.pbxproj @@ -8,6 +8,8 @@ /* Begin PBXBuildFile section */ 5378799F1B49BA6A004CBDC1 /* SizeClassViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */; }; + 5395B1371BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 5395B1381BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; settings = {ASSET_TAGS = (); }; }; 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */; }; 53DA13F01B32184600FEEE79 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13EF1B32184600FEEE79 /* ViewController.swift */; }; 53DA13F31B32184600FEEE79 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53DA13F11B32184600FEEE79 /* Main.storyboard */; }; @@ -36,6 +38,7 @@ /* Begin PBXFileReference section */ 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SizeClassViewController.swift; sourceTree = ""; }; + 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HiddenViewController.swift; sourceTree = ""; }; 53DA13EA1B32184600FEEE79 /* Stacks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stacks.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 53DA13EF1B32184600FEEE79 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -105,6 +108,7 @@ 53DA13EF1B32184600FEEE79 /* ViewController.swift */, 53DA13F11B32184600FEEE79 /* Main.storyboard */, 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */, + 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */, 53DA13F41B32184600FEEE79 /* Assets.xcassets */, 53DA13F61B32184600FEEE79 /* LaunchScreen.storyboard */, 53DA13F91B32184600FEEE79 /* Info.plist */, @@ -260,6 +264,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5395B1371BB48B4700CF54F7 /* HiddenViewController.swift in Sources */, 53DA13F01B32184600FEEE79 /* ViewController.swift in Sources */, 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */, 5378799F1B49BA6A004CBDC1 /* SizeClassViewController.swift in Sources */, @@ -278,6 +283,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 5395B1381BB48B4700CF54F7 /* HiddenViewController.swift in Sources */, 53DA140E1B32184600FEEE79 /* StacksUITests.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Stacks/Stacks/Base.lproj/Main.storyboard b/Stacks/Stacks/Base.lproj/Main.storyboard index 08c8377..800d60a 100644 --- a/Stacks/Stacks/Base.lproj/Main.storyboard +++ b/Stacks/Stacks/Base.lproj/Main.storyboard @@ -1,10 +1,52 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -20,16 +62,16 @@ - + - - + - + - + @@ -82,7 +124,7 @@ - + @@ -94,7 +136,7 @@ - + @@ -125,7 +167,7 @@ - + @@ -140,6 +182,7 @@ + diff --git a/Stacks/Stacks/HiddenViewController.swift b/Stacks/Stacks/HiddenViewController.swift new file mode 100644 index 0000000..c79f8c1 --- /dev/null +++ b/Stacks/Stacks/HiddenViewController.swift @@ -0,0 +1,56 @@ +// +// HiddenViewController.swift +// Stacks +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2015 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class HiddenViewController: UIViewController { + + @IBOutlet weak var extraHeart: UIImageView! + + override func viewDidLoad() { + super.viewDidLoad() + configureView(traitCollection.verticalSizeClass) + } + + override func willTransitionToTraitCollection(newCollection: UITraitCollection, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { + super.willTransitionToTraitCollection(newCollection, withTransitionCoordinator: coordinator) + configureView(newCollection.verticalSizeClass) + } + + private func configureView(verticalSizeClass: UIUserInterfaceSizeClass) { + guard extraHeart != nil else { + return + } + extraHeart.hidden = (verticalSizeClass == .Compact) + } +} \ No newline at end of file From 81e0967e337f2116341786c2470f5c80dbab1399 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 5 Oct 2015 20:38:53 +0100 Subject: [PATCH 006/194] Add Quick Actions --- Stacks/Stacks.xcodeproj/project.pbxproj | 17 +++++ Stacks/Stacks/AppDelegate.swift | 61 ++++++++++++++++++ .../AppIcon.appiconset/Contents.json | 36 +++++++---- .../AppIcon.appiconset/icon-120.png | Bin 0 -> 15475 bytes .../AppIcon.appiconset/icon-121.png | Bin 0 -> 15475 bytes .../AppIcon.appiconset/icon-180.png | Bin 0 -> 26707 bytes .../AppIcon.appiconset/icon-29.png | Bin 0 -> 859 bytes .../AppIcon.appiconset/icon-29@2x-1.png | Bin 0 -> 2561 bytes .../AppIcon.appiconset/icon-29@2x.png | Bin 0 -> 2561 bytes .../AppIcon.appiconset/icon-29@3x.png | Bin 0 -> 8936 bytes .../AppIcon.appiconset/icon-40.png | Bin 0 -> 1362 bytes .../AppIcon.appiconset/icon-40@2x-1.png | Bin 0 -> 4710 bytes .../AppIcon.appiconset/icon-40@2x.png | Bin 0 -> 4710 bytes .../AppIcon.appiconset/icon-76.png | Bin 0 -> 4166 bytes .../AppIcon.appiconset/icon-76@2x.png | Bin 0 -> 17774 bytes .../ShortcutIcons/Contents.json | 6 ++ .../EyeTemplate.imageset/Contents.json | 23 +++++++ .../EyeTemplate.imageset/Eye105.png | Bin 0 -> 2959 bytes .../EyeTemplate.imageset/Eye35.png | Bin 0 -> 1620 bytes .../EyeTemplate.imageset/Eye70.png | Bin 0 -> 2384 bytes .../HeartTemplate.imageset/Contents.json | 26 ++++++++ .../HeartTemplate.imageset/Heart105.png | Bin 0 -> 3289 bytes .../HeartTemplate.imageset/Heart35.png | Bin 0 -> 1792 bytes .../HeartTemplate.imageset/Heart70.png | Bin 0 -> 2686 bytes .../StarTemplate.imageset/Contents.json | 23 +++++++ .../StarTemplate.imageset/Star105.png | Bin 0 -> 3161 bytes .../StarTemplate.imageset/Star35.png | Bin 0 -> 1743 bytes .../StarTemplate.imageset/Star70.png | Bin 0 -> 2554 bytes Stacks/Stacks/Base.lproj/InfoPlist.strings | 15 +++++ Stacks/Stacks/Base.lproj/Main.storyboard | 20 +++++- Stacks/Stacks/Info.plist | 48 ++++++++++++++ 31 files changed, 262 insertions(+), 13 deletions(-) create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-120.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-121.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-180.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-40.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-40@2x-1.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-76.png create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/Contents.json create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Contents.json create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye105.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye35.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye70.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Contents.json create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Heart105.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Heart35.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Heart70.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Contents.json create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star105.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star35.png create mode 100644 Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star70.png create mode 100644 Stacks/Stacks/Base.lproj/InfoPlist.strings diff --git a/Stacks/Stacks.xcodeproj/project.pbxproj b/Stacks/Stacks.xcodeproj/project.pbxproj index 611f92e..2f707eb 100644 --- a/Stacks/Stacks.xcodeproj/project.pbxproj +++ b/Stacks/Stacks.xcodeproj/project.pbxproj @@ -10,6 +10,8 @@ 5378799F1B49BA6A004CBDC1 /* SizeClassViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */; }; 5395B1371BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; settings = {ASSET_TAGS = (); }; }; 5395B1381BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 53B55B951BC1B89A0071291E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B55B981BC1B89A0071291E /* InfoPlist.strings */; }; + 53B55B961BC1B89A0071291E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B55B981BC1B89A0071291E /* InfoPlist.strings */; }; 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */; }; 53DA13F01B32184600FEEE79 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13EF1B32184600FEEE79 /* ViewController.swift */; }; 53DA13F31B32184600FEEE79 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53DA13F11B32184600FEEE79 /* Main.storyboard */; }; @@ -39,6 +41,7 @@ /* Begin PBXFileReference section */ 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SizeClassViewController.swift; sourceTree = ""; }; 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HiddenViewController.swift; sourceTree = ""; }; + 53B55B971BC1B89A0071291E /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; 53DA13EA1B32184600FEEE79 /* Stacks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stacks.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 53DA13EF1B32184600FEEE79 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -112,6 +115,7 @@ 53DA13F41B32184600FEEE79 /* Assets.xcassets */, 53DA13F61B32184600FEEE79 /* LaunchScreen.storyboard */, 53DA13F91B32184600FEEE79 /* Info.plist */, + 53B55B981BC1B89A0071291E /* InfoPlist.strings */, ); path = Stacks; sourceTree = ""; @@ -201,6 +205,7 @@ TargetAttributes = { 53DA13E91B32184600FEEE79 = { CreatedOnToolsVersion = 7.0; + DevelopmentTeam = LCC2J94N44; }; 53DA13FD1B32184600FEEE79 = { CreatedOnToolsVersion = 7.0; @@ -238,6 +243,7 @@ buildActionMask = 2147483647; files = ( 53DA13F81B32184600FEEE79 /* LaunchScreen.storyboard in Resources */, + 53B55B951BC1B89A0071291E /* InfoPlist.strings in Resources */, 53DA13F51B32184600FEEE79 /* Assets.xcassets in Resources */, 53DA13F31B32184600FEEE79 /* Main.storyboard in Resources */, ); @@ -254,6 +260,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + 53B55B961BC1B89A0071291E /* InfoPlist.strings in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -304,6 +311,14 @@ /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ + 53B55B981BC1B89A0071291E /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + 53B55B971BC1B89A0071291E /* Base */, + ); + name = InfoPlist.strings; + sourceTree = ""; + }; 53DA13F11B32184600FEEE79 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( @@ -410,6 +425,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; INFOPLIST_FILE = Stacks/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Stacks; @@ -422,6 +438,7 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; INFOPLIST_FILE = Stacks/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Stacks; diff --git a/Stacks/Stacks/AppDelegate.swift b/Stacks/Stacks/AppDelegate.swift index c5c094e..f9d2779 100644 --- a/Stacks/Stacks/AppDelegate.swift +++ b/Stacks/Stacks/AppDelegate.swift @@ -35,5 +35,66 @@ import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { + + enum ShortcutIdentifier: String { + case OpenFavorites + case OpenFeatured + case OpenTopRated + + init?(fullIdentifier: String) { + guard let shortIdentifier = fullIdentifier.componentsSeparatedByString(".").last else { + return nil + } + self.init(rawValue: shortIdentifier) + } + } + var window: UIWindow? + + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool { + + if let shortcutItem = launchOptions?[UIApplicationLaunchOptionsShortcutItemKey] as? UIApplicationShortcutItem { + + handleShortcut(shortcutItem) + return false + } + + return true + } + + func application(application: UIApplication, + performActionForShortcutItem shortcutItem: UIApplicationShortcutItem, + completionHandler: (Bool) -> Void) { + + completionHandler(handleShortcut(shortcutItem)) + } + + private func handleShortcut(shortcutItem: UIApplicationShortcutItem) -> Bool { + + let shortcutType = shortcutItem.type + guard let shortcutIdentifier = ShortcutIdentifier(fullIdentifier: shortcutType) else { + return false + } + + return selectTabBarItemForIdentifier(shortcutIdentifier) + } + + private func selectTabBarItemForIdentifier(identifier: ShortcutIdentifier) -> Bool { + + guard let tabBarController = self.window?.rootViewController as? UITabBarController else { + return false + } + + switch (identifier) { + case .OpenFavorites: + tabBarController.selectedIndex = 0 + return true + case .OpenFeatured: + tabBarController.selectedIndex = 1 + return true + case .OpenTopRated: + tabBarController.selectedIndex = 2 + return true + } + } } \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json index 36d2c80..056c0aa 100644 --- a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -1,63 +1,75 @@ { "images" : [ { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29@3x.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-40@2x.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-120.png", "scale" : "3x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-121.png", "scale" : "2x" }, { - "idiom" : "iphone", "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-180.png", "scale" : "3x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-29.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-29@2x-1.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-40.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-40@2x-1.png", "scale" : "2x" }, { - "idiom" : "ipad", "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76.png", "scale" : "1x" }, { - "idiom" : "ipad", "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76@2x.png", "scale" : "2x" } ], diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-120.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-120.png new file mode 100644 index 0000000000000000000000000000000000000000..fac94480410962319ee58c23920cd66b3b57c528 GIT binary patch literal 15475 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 literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-121.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-121.png new file mode 100644 index 0000000000000000000000000000000000000000..fac94480410962319ee58c23920cd66b3b57c528 GIT binary patch literal 15475 zcmZ{L19WCfvvzD_VrydCP9~h#=0tDu#BSmf6n>7d++(bb?;tlqpRxa zs;9bpuU@s+4pWquM1;eI0|5a+l$H`x`g3>v>x2ROb8Upm4f=Bf1u993fK*Q6AOC5< z0;Dv7ARzGQf1RKpX&KlcAP|(6DjJR&aNl%h7)y|BBPm((Hdc*#iGf>kmQ3zch@@ z3`~sw8_d+z^8bMSrTIT$CdU8G3gF~m{Wm8QV@6YJQyWuTN8leE^Z)AZPj3Gk`2Pjz zY6$q3v%i!0FK&E)Mb4vS3beC!`YQ#hww8_pEPQ_x`cLuyWaM8cQ9B!egDDXB2PVM& zZ^%Do|7oxBKW+p#|I5ceh5rdqaIpNt)bOvk1epKr;GeSpwAcLK9Q;%G55Qlk=TWqD zHMQ0dv;33LzgaM|F!3?|ubTfvirQJ*IVb}RjZOcG>~F|FME`01w;#>_)6YLN|3I1; z^8lTUewZ3N{$srUjN0F`U&PRy@gHJ7#{bot@6TM|k+Ul=dhc}uhe=)T&dSOu!^TXo1ff&ShXkpaq zVFOkFxEx>6N$ICT3=xOP5op*ESZrKzQAZ`7-)r-Z4hsBGFi^avx3Y%qzNvy+HXBX$kmAa0)hPIfGigR5Bc1`W9 zJG=7>-jzyTMntWBqHgqPr50U{Ti_#gqXS#ti^MQVNnq4p^Si#-=LfFTsjnhN!TwQb!cU z{P>Mc&ekr4Yj>EQF|%UR4n)4ZL2OLPM(#|50*N3z{kdcjBPm}f(c)SH-l8E`P)qyS;Njrh>ZF4p{>KnTkT1At>^Lt)Q0&H`v!~8Ig;>P+77D zhg7*YWcv@(sXWu^M>mWao#8q*h1AtK37KEF7k@#4s{e&TJHdV(K5M(Y%f83G@EgF& z1_mQiRQ+SW#zrJ5+YhL>4K}oVZ_vhWw9A^61XD9Fx+J%}lRWgTHBpT6xy7U;eu~B1 zlhujV3KM`n0FyDh9hnQxacyD;tv2oAG!v%$tWo`x?oXRYk8G0gbyXYs2gK4AT(RIG zWq#f6P8EDkXr;{{YPR9_SZC_;)3NNfSU|664(OLmddCP|4)o3Bb$@kxq~b3eW20P@ zkx|s?$y6&a3bLp6tq8>dAm;<-7#@Ao=j7d496=_=^485fl6Yg3HX>L;AgEs|S}-K3 zxW_SYKtRrrq+*Hnya#?wd7D|HVMZK;iZKNv*f8=+$Q8E_#exhl36pU_r9lcAn|))N zl*WePd~#ViVLiLgZzA!lJ}Wdgp~q)72tQ^o+Bccz2VZKkK1R@%iIeH2#xQ?TaV@Sf zD=ksxbxyNS%S;pPb;qQtW;fH|Ji(Q{0Zyx^i#N&7qQ3QGCW{Lt&jgDAvDg$X35UNa zJykQSD2JZ-6f(;MSZ5*Drp-&I*c-x0mN^TD_<@Fa zxgVb%%?Bf%=gFuva#|StC}>)6dL0e{Dp?_-!j(R6hva&ZjF2nCPsufkmpVJZQ`I%&wFnMmCyorgLsMP^bR0eMPhs?*syL_Qqw z!UJb*K@JKf^u_4!9}VK8bBeC=f=QOnF>cuyahy(d|GsBQ!F%x>+2}{S-rA zyVU4N4k-=O;D=ByYM*QRGaZS1(y)oD2W)h6?c4Ibb}|2ZydHG*z{R$<*J6y}HB`5|2agNIdk`$6cC86?1DPl}P%Tc9eeKmQ?!!sx0 zB6v8W5i(e9qq^DcpLE(118>m?xDdZj=AoU4gkpgt3%v>^oWhhI{~D~M4CYMlZsw27 zFTxErSzQLNQQ>w1*d7v_dq~hgZCDP({f%pAAn4sULX)r?+~a^dW-UcZv#xb(s;(~V zG@hDCZh(;IhqEOVv-vwZC?dg*>vS>Hjv+ew3rX;C3-INnkk&y(r~th2L5oG)!p32N^$N*g9o2R?+!BF@ty`u7I57>yFWife`~+& zYn|rasKo=L+T_SbU_=L#P~%+>0Os(QrMgWc+CDrn2d>buKG<%y);W!Om$Tr|t#Su) z&ao1}8JJh=T^-Y!#y)MdK@Xe8Ye*RrCyhrMga?_nJkrmbX!@kFZf+fONssHCOcezz z_>1op8!c|FQN-6NId{iNG<`)MRB$ymSjL48WXx1SFxFVv@qbhmkXN-3jpeTg+(E^H z!Y<;dVGok$4un5x^A6dqzWWI_eFd`jLWL_3 zO>+0h6VTQNyS&nJ?xsl?c31;R15qB8{#?UF<^M8xV+A~^Ze z9JT1ss!${ewpnoOab|;vbm(Fw?t!^;Er!>MlvdC)>PE6Z zK@dW?jpTq^(CC4)m4G~B(2v4w9jfe?ZgY>GSQ3^~%aRh?;Y|Dys@^FuO-b~d1A#;b;ExqYvc`7Mb=XgV+y4F7f(w=8LZT8q6A$h{{(3B1}MQ z>h2iADhg$E`0m!rBNoODZAP`SO*_SZbD;odx+pKWH2?_@){a5GeevIjVI({rT1^KBJ!1S7hO@* zX%d=hV*#%9Sn2QsC^qGss4x{9kGV#DHoZI4nP!T!Rr9k}Da!LgFZPpS<#uxpaX=;J5s#%Oz)!>*Z+n0%^s$*^G7-$NhsZZ8S{TB56-P{e@hesKo= zBOWsrL3*6c?HQj0;vqi^G0Yv%hr-)vGMuSF*zx5CQ$j{z02~E-s!?_`*MON>~kYUgsh{> zMj?Eblxk=4LjHS|%g)PfdypR92+di!&kT05ySDz}c!bhE$G{cLnJy7GakSt<>}RZ$ zFH{V^m3Xou#JSTy=EP)w@bZNkBP4{aOQFw$a(#&`c-fxH$tY zXpm}>_^0Ncqn#%HmxAu}#rvj=8>>q`A3k(drAY?+eFIP^V)V3<@!}+MxxSwjh!4_d z7M*qTM|#b4iBj1x;kmaahWTONom6SU*%Q5h1pz6~Fe!@*Hk2}Q+ zc`=>+X{n4+guTJB47c$ytcM=S&GVZB7+O=YZ?R!~g05$gO9bB25*uAkp4-2$2tUUK zY~9U<`sb@Vjg`vtunF+0sz=$7ek;ch>bEfNf0uNy0!#E}!TiCZdfiiC{?o&BtCvAt z$VI_5%!ETGM0_rV)#k&k6n9XSIzQ@IBDB<)4kxaDPQDMDG9ZpXxCgw+1kz-i49+4&M%=0)62 z3l2;tFNKma0pS81`3?O0(w(>R>(^4fuDKz*0UXA02U}$tlocHgu9}`V%0(R~{K)h@ zQys5WDV~@L9(C>VEi@xJnga zv;PG@;iW7hdPy_3)%}&S@5Rp?lS{}oOO%eX*Z8oGN%COyE`ZgMjv&dXiND~nBhnzy zF>iTX4yttOD{=2l20A@Z>C409T5GF)KEJ24_cJ2{pSO{ZMz+V}hw-E9IVN%-Xvs4! zN&;>RJ7uYRo3<%$CX6!Ln>^LDpR;I%2g)5 z-1L~)a9GwXBJV;E`+|F65N*^0HadyOBnqSd5$SP|t+6~a#)>OfNwd6TEVlYrs*N^O zB1ga)?~m8kU1+@|H>RbzzcetEZXir<#A(6qtj68lh_vJRG8U_M{j$qO62@WdRzZ*-i(?B!#%~67;r6D7tvMN3Ar`)9kqRdY{Gplj~B+a@TbKgs}7=W5N zK`8?hR1aN8vs2e9RP&z=x}GD(1MAnoovBt=3hG+!oqXrJ*r0cS*^4P{Doj1+RJi*w z?GVB;RfM7rj~=s(kU*Y3JJ0P&V9TV?SN5k2T>>mT@ZGOe)aJq{lNQLVRv91M6hGg# zI`=q!0)-A$KqZ&BXnXaHL3R6^)7;*fIe@!`lNT3u?Wb>Lc06)#t2G__0gpaQR7n0H z6b_*pHP-Sm1GO(nVHaI@h$9h{$B8Ws;@LQE3~ z-^S5-U%ijdV+cl@fIin0G3bE$#Coz+tTltY>}0R4|Oga|;H zEL&zpc>$`mqG*s;raak1R$y`d68_65vYtnb#`?y(6@$+*G@wRaTYCEo-dBaS4bdb? zccDhYh(Y&)mzQnSCDWjtaurV1?;5h0V-~=8W}Mf#gk)6KOlceBu)NzfSU+zu=v-7u z|2!1$MEQld)k6-U-7MKjCVe`Li4&lqHbh&n@YU45Z8#qn|WiTVcAjHQ7T z&xvzPSL2XFcm_B8Z3w@#J5TPoHTCux5I$3}F^Q$Nm6Q@M*WrLnu9{3}0T1l!p){n3 zU9KlR-^M324O}Aa^PE)`VVYFerKKgqR6gGs*myGhboHGzQAKHmBWx3e*3pZ; zEmFZtfI`+jgi=YBYN-iv+xRAWW9QBc#>*Ds=`gTmi(D?}hw2=b1#jUN$7Tsf<2(^i zv+lj{bRu@&ogDmx)f}9>?rz^Z)>$UVrCVj?k353xSq zt`Ro;qMA4uU&e;eR*z6AQP$>$xn@_H3g$fKWdZ1ZDe85E$q_3P$KP70D1JAS!$`?> zYsBZ zqWHNa3`3_&~s#@Va0Fv#QMTgxIZ|b{#t=57U)Q;o7fLP9kI)@ z{!*Vc(U+EL*p9Ua_b+dSLy;&F{84+y>zlTsu^sf)?IQcGMVbWuYt;D~6aN>bf#lAP(@^a$bmX`E2NNmo*ep!m^O!GpSOsk_v{irR=w6A|cQJ z;u-fHdBo7+Q+0rZ4#xuE{3jA z48pNkj?Qgoz*4nJD;j?n=5vxp5~_ z< zy(FjFcb0o-qZu@-I-cjxI&<29m)^U5$b`I~dPB>%ty^0)&>OcrwvVt_2};=SoJMlG zBr~NYY>s9bI|ye_ zdqoOGQdNA;S6-5n5{tAkgl|_)k8hH63ovi_=NGM?5J5g4J^4rS+kzR~T(8TiMQgp6 z6j~mmc_@t)wN5+)>jo-Mb>FNDmd7z92akBYCmzWrWaTo6Gy7TPgY*Jn+sgB+2d3UO zea=g#X`}HoFt=K@F9Ma`CD8?P{t%k$OXz(64*ywx>h>lSQ$nR8)IB3H@H4z#7syJ= z4en&@KE}QoGVLJ)#${dc%Fa))Ibph6Z{ZLBO61+AtoJrKbbM>t5qIYE`oJmh$b8wz z#i>2+!R zaWJN3lF;@vV&{Efys4UY3Tl?MojC9-A>h8k=!{O-bZ?ub#nbsHCg|ufv+coCwT#_N zT(i-T$BtomhgB~5V=|&^_r7VP@pIww{qwV%I#1udE&DTB(E9_OLHXN$fFRt{hiJw3 zu}oyLlBT#pd#dgfi8U$y1Kn(&SoF2h6~w!v(=#_!ki$m0CTG2u`6YpK|Gv3r)5g!o z&8J18=if5#Fp+tA5ptAizszoT>9?czDZqosRaf`gRHl5vb7?GZ;>ZcA6ZCl30E zXj_%vb+vy^fxkNIUDq#puJ&zW-K0!i6lL8N310U%X{PIq9F)=g7?`10vYpE;^RzA; zrZuZ^?p6B`Ur;h5i4W7K8I#(y*upMp9swv#k5PQqFQ7RqtZU7 zkYRbUw}?PMGd{q~k?qijE`^k`ubAiuD#9*!Q|qFrfAJ?_3Fy>ORnsU};02soWnGU} z`E*M*yu`16OsMNSUn_6Gyzl*Ny)BPVE2opb(M#h_gjwH?mBLj02@P*5Dw>QWP&+F; zwt%LuC_WF5f4+c)CrF4(*TZCbcwlYcys8`Bb)i}1+Uq5#c9^np;n8)X%lNV=C>whs z-J*j&-mf!(jhUFJ{xbeEyjzCpmkI}G6kkCJ@zczZ)u7E{=?O*NQmRYG{{7U)y=3OC zv_hv?W05Z4S*G*$@!>rCMUE9%>irgLk(4vm=p?PiuVpeVxq8=(#xz@$UpJn{x9Fu( zaYi#gfg(twue*@FG%j@*9zpL+;$BKEp~K;|BO4&!=+*Yf^M1g|cW8>Wb{bmr=i^Wl z|J&7A*J%^-*GOOn3anRBbh&ZD`H%}@rbXeSRNu2 zq@c%{Cg|udMQdp_oSk;&q!`J ztewdPFa2kg^*w9qiagf^O8K;8_nT5#0VLWQQSbQ^6USS}WLy~v;b#UI??x4MV8!&D z{xY`2*m&DeGy5pCs>Tl5;Klo;eIL;uCXa1Hh^{_0Hu|5wG3^I9jDqLg=CTZ^k5?I zepnPRrEc4mHZ;SzIsw!6N$#=hu&Ft;^+>+dDQ^$>iXj;s*E`JC78uF70v24=ecus} znFg<8FA^o|V3<9fiJTwe{tSxgVTSjd>-zEQQ0D9Prq99Hh4-j^otjQvsW$hfwV+40Yan-b#n;omak98{4F8~PKtV~fzx^GccQ8Qq$|USH*a9?}AP6>>w= zU4J4(pLd6u6-jJvzMU;qySJZSakv+ds4ccaWP1AfqNF>&Z>$kfk)#ipT)7sX4<8*%xeC#vwXXk4SoJY+wAzL zL@H`z%3MnP@xl2D9V=wxxsg%MIXdcJ83axx;AUrDumiA4Tw5Xd8{+mFG3G%w6xUNl zEZ^L-x5Y^^0E4K*S;?8OBi8Z(>7(K1CPglBfNfM$tH-=ouRHUu83miptJSgWhtbyz zZ+`r80n-NTT}TB?<}S2{)W|yiV|r2!@uluHIXS!-DrHLnAqkCwZdt1jIg0Fr0ciA< zTSb!T_&SC!YnT8Vf_CxmiQ?K39nq#Y$ zW-MAzG>zzlq)L2Q-I~Izs(YD<19s3dSuS$xIJVxgva!QArMbo)Fe8FV7zSX3v7NQ1 zP-r*Juz{hPy?dv7K_QMaq6i4k{<%#c6Fm5+AV^NOit7av{Sm%h&~Xo6JQ@7amZ(b& zc4Qvy0j;26mJ)vcDoxLfJ{T#U~NLB6^Wi_@H8B3{4ovplpvHJbPumy^H}sVx9swK3(J$&5z(H?P`OxTyTe;` z^D7)0c>blJKJ_9;D>rx2hdyHsx~nQ6)_i*mxfMmJbFUwf2fNe8(%ER>)#TwW@`g zFIDHzvL+gYUwxJh3<)G&UbgH@AKXt~$ZRBd+2j5S>6SnttcsUa%=8>DRb?_O@qLXO z-B`z%r9ncyC~DC+egf6S9fcdjAE!!sL*=o(1HtI}YDG@$IUHY538{0urhm%$y-xhsDkYZQRoNPOKT#Y8<$U~ zf}WS&GsdoiHHzZwdksiyY3eoxWh*&6pcpnL^}6)5d?p=k$a}2D>6hgFd08E+y81kudC`;(c`(H9?1w%T*knWQgSJRYuw}w?*-m1R z=VSAk@43Mgjph$%5a4?F6o?71<5!Y)T(^Z&SCQ-r#@yPb4k?YL4n|+R z83~RqR-^+a)K-r3qkzo3tP0>~M}}(eIaLcQ-2yqU>5w?D+(j;ejQDDR@|x^JIIKHF zDzI*|!c4AqY@-q2M_R^J!uyr1bF=!vxE6&NTGy`TAFZMLM4i;9Bc+h+#~q!8bQFhG{S#GI zv32xlUd=$3;@&bczuEqG)x!YNJ}v0p+zdo02_2Lg3kAVUk){Rd^v=A8$jfXI779Nh z8jTp$4oekI?Y5ArmYDAsN6rT&+1@Wfm(63|W*5yM@ zWYzn^*=D|goD=(DadpbU3j9VSqK<$m=g?O#{oBQC@14^rf%CyfeUC|nkLx*omwke_ z+f>?ig{KkJ#JA$miC`R|rSOL|$*7yk{_!mCEB`{nG$)`GHj1MIHPW~9Ivm8qTZ`S$ z+1Ml4<}(l*Y#r|c()PwV)$DzgDZj|PK&EYXL#RMjNG}1mxzwc%&(?}5pvMWM&wF;~ z^8zyeX__HmLsR|zVov|Ah=})+YU3?(OyDCan`(J6H~+Cg#00X!$zDwPw<7yWCr-Ba z**7pn60%wzl4TKeSE>SXnc<)Em{tpEB?J>F1Mn%4b5h+o_As zUTeS)$JfS~b--d&Qjs4tr&*gZ? zt%q^h?}eLQgF!ybrpmP(6CDGkw62G#G3|S846Z})j9xd4IyVGMn+|OsHMC4f`oN3b z%SVzpa%fRgQbTbkyHO9DA@l+LE*d;!>1Dh~r(YhT@xO{zU>m%V61<0J&@Q^Ha-#No z{VJ%^zpQ8;tf0?kSGaAGX-BoG?{Q}?Z3 z>;#n)ArG-E>&_utIsPVYt&2p|l1=b=Il;T3{&}q+clw&dkn zkOP8#D-@J|0-(yQ;hGqd(QlXxu-~m`=do@vp6SNdWgArj=_F_rYY2-q=r&VPFc;V{ z*^R}Pco3ew^6?QDynh?>zDV~uZLfPneE8zir#h0 zsDEWn)Urjjal@bD^+w|ERe2tsucOUhbFBA;tmy~>V)l(va%RHBOD+o!z5O~@Pg@bR zN9NS`2Waz04r?-HO#yqyEOVpK1tnTs8`jG+s_}koPkcbp^Ni1Alr-(lpGDMEX3NJK z)792?Xbtgcj@ZCV*YfOLw|wZ1NzZME)t#b5P| zym@zGuJhE`T~Ok28APdN%Eku+gKr3u{i>i&b>Pk1hh70-YjVkcE*A9p{habK%G-G_ zsDCqmYS)tPn||K6lnH!me1B`KR2Z}{nKohIy>)odk;P7PV-kiZ5Iu`Xu+0Wjc&h!mGZ4|W@(@XL+V5bmHD2ORK|y5?7_?vj!)Bz!sUD9dIU4J zGjg7_aqWF;m-R?C<-V8gCOIH41>)7EhtY9%5Xdld01gpH8^_oFA&abE?icT`QnSK; z-(4a2p`h>b1nu+W7UP5N^1GVxunr!=OT6^G*I9+;N- zZ<%!df|EFh9YBT$hQtB7nqe}}sNA=5{>X>E3h&OO<{)#V>X{ma#9+87a#qfXY&f)4 zs*pa(rOa5~4P?E$LE5ZOQNfpns*cl-UHKRo5&BfK;K(t^!$Yb!VjsC~lelI8JU*+N z8iY5)Vtw4hL4((hUeU(Yn1b6#Ti2&#=k1%zndLdAnK-#(sy`GGz|(t=@7kz6%y}4j z9iLvmo-km3PFz3O(Jp@8>t=_F4#9Ci^@uc0X9^MMFE~?<mSO@*YJKdr$3$>?*DuIIhcQwB%QOSp*hWirGu2M*NNMhb5NhuyCeo}&i4 z_N0!fn9zN66cwKbII+odc^312;qv*G?Q_>lbOS+KA6}WtZOh&0<3w)fQnetq2x0|Imt3O~mCWFY&Sfy>h0C|&fWoNTTg*40 zJHpO0&v3Za{#;PtzXlCKAE%z@Yc(;MT&JU)-WrVWVIChPD0=wGPZA%*iwJ{Yc4mnE zC|mkV_n!Y)_|oeY=yRr;B6zHu?J4yhq!i1)J={M`7Ekqyi3Hxp)W85a3W4XhBM1$1 zy0Yem^Sv=oNur~Ms9FBILB&sHZB{Du0j8jDpJ`}?OLjuv>;Y%YFDzHXuw1kUV$ODw znbBjpsWmfUobNr4apB3twaXxeld>Ka+QwVj0oR~wt|e)IKCcP|iWe3Z;>ky17a;RC z+?Wnqgn##RA1lU?n>WO{f@h=W%!0Ax+^9qwkyVIgH8Jojb!965O$s78^2(uSm&r;W z%x_f1#xp{RpE86xK^=FN2eM0(b+5oci4x8mTK5A>+T&a-u@r)P1UvOKw+}fD{&%2_ z^|>^#5?runW~wiRLo%BiIc`ET}~75^cE|2cU6+ou>D&V#9N)DADY6A)JsK9hcIN zn^r%Rffs$pWHZfYj#xY%qMf^Cs`a}ifrkLjuGHwNkEckqm=K<;$60B12vmr?0m-R2 z$y=T>U&OG_g?ibsA0>3K4qWsLwwJ+4ch;^3>-a3mGDfiV{xQVO-6bpTAY|{n#RaXy zoL;hq#lBuyLc!5>IjFF;B~LiRR@m2>-ZX+nxgXS%hm`5R>^(ySG+G+4GPlTg{4(xo zE50so6mVb+T;;m=6X}CVHg+(WmGKd99xJfVHk7n0p{sUTUlTB=QNrHKM60pU_l2hC z;5c)x$ohBo1L~|aQ}oW-S+;6P()FIMeie29*+)!W-Pp3j1dOctBSkZ>-S==tePe2n z%bIA5Pa(}-syx=25@%(8<4H@?7XHSakV2#=+kM=tOyZ;Vh9Q2juw@QJ`o`rxdGq2-$UVFLhl;3;S)DRWEvT1#!GA|M@i_?lG5XN z^60?oMCak-A&1ljZqP9_Z?B4u-OPT2>MXOBfFVqLYSa>9AFQE{n||<|YUdth49hxz!;QXKy#b1$I zZ8FTSvgS5y$-6CY{SYE*8E>w(mqNYA4J$$R zd|<*i=-+%gJPLGTPhEwuP18CDvF#ey8*PP^1$>hDXzj6%rcw;6@o4<*in&C+v#GOJKDpFltbN@3XhYG(FjKf^lQOPtkIZ>*(1~1!`HwOASM(OlxPW8ICX1b%&;zB(i!qovpzNWlh82 z4S8DQXR2Ox>dFBQ8xaoxUxqf;2Y|6=d%!a`D>@!&R9*XxB^x?CjSr7hwt5r~AjVT?OPw4Txa9%sVAs{^VC;{`m1YO8`OZIMJ+C)$Z z=WE%KE6e;?72EQJc+PsU@RaOUDfFa0My&luJy;)wuV$qQHapo$Quy~U4t0}#ix*ED zqfll|Hq0Czu$HmIXJI*^1Ib@-jL|l%qtP4fz6GoMW!KxR&($dz2fIh+ z6!|aeb^60DvE4dH=UQKaxVX+W6c^k)Wrgi!a zAu@Y>pBUYIV@q&0snPyxLT#ejexo~ZQ=Ozw<4 zkm?8+;Y%WwJo_e8gKc(kv#m3WVHWNf^JAMcWt@&}*K$w`(Tg1eB#?((eQs61bh2cG zOFMpC5JE?X;>-L~(r=6uWf|fnunfw;iFNu9W2>N5h=!I>gowd$ZKUVfK{I)JMGAac z!!?KpLJQ))QSXg44vr!^@(qOi{U4?p5*oVwI?6d+2U69cKl6IXj=`uT#=k+UR~dAf z(4LbBt}v7$`IYh_p-<-s%%3JDASyg_z!aS$LW6I@@YsTN2rfFe6nx3wwPG}B=10o# zMVdVx53V`H`+BA>A7#X>nNk_;b}R)9ycR zkRD-~>hP0-M^M@-?0a27oDgBN;R9@1?)iCgPQU-oytM%i&>F&$7S?K7ID(QzcMNPB zYreTwg1c=X6vve!2jx$dVeGB|n$6&$^_Cx8jeD6HH$8?H+L;ZqiTjc})Jq`a_Y%)2(5&mtyTJmaf` zkv5f%I)y3Lb++PT`Jd0vkQluadmh@sW$I9%O|<1vT`j znn_Gw$b=TZDK>c}q?lQ+FD1>fcBxJl9pb2MsVz${QGzig1aHU^O;|fP=U5v`jr*%G zWx0z|kuHT16|z+n^-Dg&buz2q72x_T8yp(vx$@nLqh1sCc!Lg%; z9kiZxw%q>iHUT=FvYC=sK*3DGd&VtWAn-tYC(Ll3L&A$x(kbc&?hywcOA8Bij!{4- zqzW94BHDF@^#o%bok1>Q?t#AxKy|TghvVgzl*>iC?dDYw;)$)!TI2-C(o{{7?~j@^ zC-lYV8=SHE&dERm%zBAmWO+;7N1-v4v2bxbPE0-RW2XT>J@2j~;zSsFe|{~UYCPLN zC!Ku0;b6`Xp{0F2*8;V6^A89KOt0B7sPOoHf~^zA1&c~<8CdxBso8jbYe|Q+BpSP+ z$dCvy;BYyx|2^M1DXomroG0#<2jE|UYOc8XT}*16-;zgZ4g~>*28x2DAbq^uE!;|f zgu9$T^1uX?q9 gi|XCy6`$Y?=(;0^12gY`{Ru2BE-zLoV&MP(00%Z?ssI20 literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-180.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-180.png new file mode 100644 index 0000000000000000000000000000000000000000..fd2fbe9cbcc2e6bd3044c35b2e102714eab2f3cc GIT binary patch literal 26707 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�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 literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29.png new file mode 100644 index 0000000000000000000000000000000000000000..b257b07226846aca036ccff246e65d2e730a5e0f GIT binary patch literal 859 zcmV-h1ElIUx?40wvf6u*VjyPv;fd3Z* zK>ElefQ3kb^j=I=-=i9--XKT_UM7H&IPpD_B^d-s0`PEoVnYZXFGfW%HB#fMzX#}y ztcmlsYknV`SB8M(m$Ofb8uq`5j`DIYxIcz5jav_#MCJ#l5_U9|HJ10E$p0jc5!8X( zE(XC#xBE9NUTg9!$V0_kw^lMmN(!lzcK!TwMaOU^0F2pJb&jSV%K5@=F>w2+*5Lw* z4jHX<-P6*hx4EFID1Ey3bUQ?ngy80mmu43=y7jld<=uLJ!mEjt7vsi~jES%fqSk>j zeUfMOqqf8`d*Y}q!FL_98l7GVh$`F5^Hxur40e;@SGHlslw?njcOVA#90AcO*J_W7 zMRxUh>Gi%{@Q*6X9&4|7ggSD5o$@K5J+68j4*+ zpXogOU?_hn&~0nJbyc^-MY{li<5mZMRu&fEr1@yu`_18@g{j}49lN)3`8))*toVDT z)4|ai!#OZ9%sr1&)o`vgLA5)yJ8%p5yh!nHI&MIs~*#R6L?b zE&vcrvZ3jW*5TqyJ3HcI=1|E%T11aW*Ep~*HE!le&dWd|DTdGQ#*ibHiAQH-q0$#l z(HRs#BJ#<^VaoScG_08rh3Xq7S_!$4>$RrQ@v*oZ?es|ALeDpD?InvLS3qJ~0`vk4 l^Y0T)z+eOe#Gt)Jgg=K>VSjU{PzwM6002ovPDHLkV1n$|p@9GZ literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..7759c83f4b10efb32e7c54af86c6cfd0adc14e64 GIT binary patch literal 2561 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≪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 QR{#J207*qoM6N<$g437vy#N3J literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7bdbed3bcd25858e35e136552a11675defee0c45 GIT binary patch literal 17774 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 literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/Contents.json b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Contents.json b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Contents.json new file mode 100644 index 0000000..7c0a4bb --- /dev/null +++ b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Eye35.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Eye70.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Eye105.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye105.png b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye105.png new file mode 100644 index 0000000000000000000000000000000000000000..52d59ef33dd13baea4129abee213291e5346bc3e GIT binary patch literal 2959 zcmb`Jc|4TcAIE1bDO-s!BGVAUtg;Oz`;sMOk7CToXf`ubhN#BY6_uhzsiBQ5sqB+9 z${0$vkh&?A%2rCQ#GSe`)XmSY{=3ifdY|$6!Afk!>y}rjuqW(J( znf^U1VSaFC7!{6$A>hA)7=(zQ;r$OK^86OVGYP-JM4owUt{C$%S_&(QcBkM75wZ4R z3_J#fKpI1l2q?nX2ZcZ*5olv$OZXzq&kW~iI~qQWL819jC`61Wfr%%QL|w2EOnA?; z3l$4sQ6A{cGy+~&U{M({NK5$t*%s^VC?qNkPp6CY!qDdQ3vG+_-gr8NxJxv=FPXr= zpuQuE%!{eOpMH$#4`!ipF%a-8V4-mVAX*6YT%`i+2_!suE*B(1n9VOei%B~QkwV)- z4GYJM3O0uAi9v1FVe8*qN?$H5ZIitIv5$}5hDp6%yAwz4H+Q+R zj^+)dXTs}!HW5r)wwvs3?OM0Rdsirw3PYy zl0EuncRDYHE^&NOrbv`X7#MesPZzj`!fKRi265JdP{7s((2ARgwX^Jx0{t4v8XPXv z@RJ{F%?e1>?MaKYFW?WwGAj)`&)rbV6%$l04HWFPlV8sA9(#;;#%kkABn-HbnGPOC zE{CiW6LPs)Mi(J!T!Qy1eaxN)UtvT*eJn!jS?#uC3V5`deI>`i|9w^{yzpeY@?u#fRz*7=cbkP z?w<2d<24hXssk#e_Z|7z!b>)2ysyRl0_?u`1=`e;TTy3eBgwI~<*mVvv5xs&G1Z7O zik45F7!Mnh?>Kf|&aXe9&}`TgNP2c1r6Cpd>XCTAx8zyZg6jdbic(RZ>?((*syt2Xy8kXP*+~`!KI!jdFI-enV&W|Q%93bE!*E%uq*!P#}j=86~m)x{ra|? z5OCGbGf77T#@J-+ea9*!O|yw_t=AOM3=Mfp6$K;LU zM^uNo)AY<~H_eT>F?~;Tj-z7&`0O>z&Q~Ezu=w@zhTmct6RWhekiEW&2L+PhabtRi zTESUb+)dNkGdE?LCwIq3CRJhoPT8x=RJIIewOx963a_<&0%QOm;7-8%9}RH&01kbd zc`lKxy;x!d(53u`WEv>&GcZm0~*4}GZJZGftJ>i@~ z(P+1BaOi;2j(yvvvp;FKLrRg@EA%JwWRoVW??yFw9T2CaXm|MeRd-MIW^M{5iu*}L zMfYWXip#ncUC8g)_aKYh;`i!<&P=M>fteR$pa;Z;o;Ahp9x9gY9;KIe*S~P8PbW6~ zHJ#7TWYo`;@Rg$%aY-jWhpT4y@~}^Tu$QTNJ*hTPDRUv zYI3~x0ka|MR+qwBJhP$bWOG~&5t><};3N)v*aEKbOcE4GTX7FOdz7Xay+tj@Q73^r zV=~Ml2Lf|oa?{n=-iIyzC51XY5xkWuFE27sIT>-R;}wii?$Q-nA*yW2eAU0^cBhwI z(K@B#lgMbVpd9Cj8G*JB7uJMb=~rC@DiPrf0>${3kq{VZ1EpJs{uq zFsc_6$fJ&(O!BZYs_Nf$OHG}yTM;?U~goy*M|nPa{^>_$D)*Qd5+50*!5IRu55U$Ne( zpq&!Pzaa?QzWO%p2F;yOl+)8kj3^AEIwaJa=F>&qiy<5c!{8F_4AVo@fSr6w^YwT)6iP*ifcSTC~>5g(|2nn>a{(ZC5{Nq`{wgde`zb8r+qw z$sY01>GBg3#9$d`Yg?{;-O?G7aw}I;oX;XV9Wy~JiF|%aEW&T?D1_Y@A;$#iy~$Kj z;HVAl1NK(e=Ad8a1!rfaH*f7^Q^%O6g!t*To z8tFl`*nm^Q?@m0Fx4hACK9nu>u26iW`oxNER;O%Ugf)LzUa55M*FUXu3)Opg3ClPJ r{B4I}ZTpP|WX;6?i>5+f{2O3wJ@$^m7ug%4zhoB&5BsaOp^5(hf5^tU literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye35.png b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye35.png new file mode 100644 index 0000000000000000000000000000000000000000..fae96ef56e3028f0f361019a06ee5e770b435a8f GIT binary patch literal 1620 zcmeAS@N?(olHy`uVBq!ia0vp^${@_a1|;QfZjJ;}jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z81_tI8nIRD+5xzcF$@#f@i7EL>sd^Q;1whpd3^o;3KxS@gNuokUZcbjY zRfVk*ScMgk4HDK@QUEI{$+lIB@C{IK&M!(;Fx4~BGf=YQQczH^DN0GR3UYCSY6tRc zl`=|73as??%gf94%8m8%i_-NCEiEne4UF`SjC6r2bc-wVN)jt{^NN)rhQQ2mNi9w; z$}A|!%+FH*nVXoDUs__Tqy(}E4xsMLEr45;R}A$P(0}?Bi3R$GdItK~G?iqgA)JSz z3nYV6TWUon4s9SAh&FIwK-_2p3{flJ{FKbJN|(fvR68RBLsMNt16>2t5F-OCLjx;Q zQyYCWH3%PqbvqZOCYIzEh2-bw*ac)(q~_#;xC+L4KnT%`tO7|h$RAezMVYC<00sr4 zouQ3Bh8Vhf=ltA)qSWGIkb0og!0M63(A5W}7U$=bf{YK%%Pg@of@(n%M%NXIkhe33 z=|L7m*ARhC1F|5J22ey;fkP_7B{MfQ59}9Xpl7g3plfu_&&e+eE=WvH1%($_3z87J zYOpntxU4~vfNHeS2c>1Cv<=BPU{PSsvEu^9C@dG+afQs86~e&4vR?$}ZP9!G3l^6WfiJ(1^zGAEe42x`cRN6W_pCpS+-P4-4;(6f5s#>I-Jx zcGS5n*S7lt({snGJ9(Qw2=Y1n+n*@&YJtYm&VO8G0+P4Plhb@2nse4We6(L6%@rgc z7#XnW{RKun)5JH7yqhjPywLTQ`37h2CA-HTKF^xh*0ek$zMvxR_&3WZ%iCXu+BL*v zF6KF?KjFSiOpEf;1)Kp5r>q(DmKx+W|EW7<{Uhz)>2Dk{S;tpgSDmk4z_~|iv3p;Y zZEW0ng^KJy_dZ0+etKD-8vDQ9}kQ@FP}_haT{_nm1AxITr=>iBSX$>h&&XLM%m zESom>0^i$q!{ohrg?Vp_T~;$~cVLfad&9ai>x`4~6rZ1U=U*gTVGq0G#dgc~r`DgP z%kyVuUtoydkaj`$FIP#SnwQpu5QUWoR<1l?-x0nmbxHPvI#5yX>FVdQ&MBb@0CQVS A(EtDd literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye70.png b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/EyeTemplate.imageset/Eye70.png new file mode 100644 index 0000000000000000000000000000000000000000..6d8cc99af388b6bae6b5e357202c28179aadb214 GIT binary patch literal 2384 zcmZ{m2{@bC8pmTNxK*L{5mA&*^2HtzArh*sC1ML5tw@86Y?2_9F5LENOLeL>ia~GG z^0=tdbek4cTDxgtnW|FLsot2@9o=RI*CgoFb@lt6^PO|v_y0TRyze>ZdA^gxz+Kv4 zV=xE=(%$VyAjxW9c~MuDeUlK=f0tDXJkl<2P{V-fzhxZ_j$b4X1k!}aivp;))DQ$x zs-cIH`Q!k9G?mRnP!6(VX$S$6BU6Jw7y(+=WYYK)sDQ~}@z4Sf*op!zYs<|547wuW zCwjoh0YoUC&80z|5l#ps3=4)rp&0JLI5dgiyN1hp9|xpWSn&SpX7<5FVT$$SqOOg_gd?3p9gt{yB-+^p18mTIig1O-b7>Sln;XhzGq6OufW~0TyHH1j z>|JHoE7rmCIM6{{I!%^fc^a|y7~ubG8})cLlf$L)cyhh-ntr`)qnajQILH z1IxcO1MyW6fNMmXK1by%h0UsCv3CFQw>J^iA4BR}CkJ;ld1@U6-%v2)s07|iLX9N< z@_bClK&3Y8{;f?(VA$@HA!=j1)SeiTKxQk9Vmk$;M_VDy3aa?_f9W(n!d#8kgoGTd zAAQC#@Z>G3G~6@isO?w16K?6%I6jNiJmK|-zhs@D*tuh0iFe#Ci{C4)d^IKbzL1fQ zLnb2~G{3IaZnt+8SYo(K4&$zhMoht7pC#T9s00xA52|VRh~O8-pLy)iEWvLxXtSBI%{vA*H zOr`laVI)L7=x27%Uf4dd;gzitvG?~J3G^^{8$LJeS)~;&r&=h*Tg;945ypqyq-ZNkv>X)ZaJgAu6$6FXQ^fH#hYr z+anv}a_ahDTNajX{o;4~e0?iopmng*ER7M=Q5TwLJY(^88+=g}7gaZNYO0coRh>+> zjsg>D9e-6+*3xFuK9TrdgMH7Vhj%sn zK1wfrFS1;84&tRUQ|y&Zz449ZdFm)BJ#3(utm|`NnJdyJsB1{az#TAQ)i~h`o7b6F zUPTMbhEXxx65Njsku9A?@rMU*j`=B&oJ>^$Ni#gHR9FawBV`oIJ z{yctIbNgE}WgK6U-Pb##I$h~x%eq}oC6DYsSraiS6gbJIcdUms`p1%g!7F#{S8Wh%I)-?=D~Nk0~Ig0iihi`ogZa z)%#0&nNnlwo;a!1<=?VPSOUeDI5I92t1P_qyehNHbx6ad+k5e3xU0KaOTcbXb>s{r zCwguw%CN+HOc>J{9O*iw_zr0p%g_p}o6@U1)i}8I0&%3u$aj)^&b8uJc(WSC(yzv~ z0_+6w*domodL1gt$9XiFkvh*!9g4y5O~eo8&0c literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Contents.json b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Contents.json new file mode 100644 index 0000000..e78fc26 --- /dev/null +++ b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Contents.json @@ -0,0 +1,26 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Heart35.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Heart70.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Heart105.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Heart105.png b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/HeartTemplate.imageset/Heart105.png new file mode 100644 index 0000000000000000000000000000000000000000..66653a66c8088e8c57717d5b67b86c94a055965a GIT binary patch literal 3289 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 b-5a(8-P_)N*rUYa`o*QnI_2 zTegstZARL0MV7K8OP1oDk#1gZ{r{iyKj%Ep?|aU9o^#IU^N%$())fF9009610ew9T zmR0Mp3oke8>j!-s&8l`$u)11+l5UAfR)>$QXF~x1`1iBRE56bv$akl`Jah= zDO*vo;)Bs}WSAlp4*MBICAj}s-v3Z+&o41NjqnSM?fHgnCga;0)mRxt7?Iov?!g!w z6^~MaE2=;g;Sjirxe^?q2uB=OR)g)({D^Rq*7nEas3d=L63GW;N}%C=i0m#{8OnOU zvD+2fV0Ih`6Mq7pm0)%nQHpA?|FiAXYm{c4)~jskx7&8=v3Lr}CxAV?g)f1M zQrbdxn0Hb(Kl~`w@62}NPQdzSz;@#{fV~lj%}iNi2t>T^W-O|3HP}xbJ3(!d56S-w z8Rv>;=W7$$X4ATGzg?V7E9>T;-hJ*W(VoP6`1q9pXaIG zm$;%Uo_{9Y@X0|8zof!m?C7XOjf~^$`^vMcOUTBd&+GRxhde@aX2(}hIcvcUJ@a8X zv!!`?#*3h*3Z|v#dJYSxNFb%#S?bFo_t)kI!fM*^i2{yH;NkPQTq#rXfTsAeh!4Oi z(yH12qm-Ujh5FtEphwg}^r`ZwsumKbRAh{^;xhlJR{O|1{70lI9asL_%a^&LmkfYr zH-OcVW$UtXD{GpnSHu=uKiPlWBQNr1=+LSvBjO;h_S(S$m$Zu896sDgbl!_+6pgzk zn3g`jOJ0|_vr2{sWza2lNvUyi%mCS1Kqs*AT<%QRjBrL0cW-0Gxk1|*_1_kFKg?Oo zCAgV{O92k#Y3A&qz-FFCzRy0EKGxHOw9yKEn(cDRj;9wX>{&%aCRT->15Yye4p&Eo zrlMc8{sl$~c*+Ln#Cy)}*~c)g`brtl3N_$}PnXZ(LG|wOl;TWSZ8`=_Ww=u1OzD1w zq6X>FUD+kDRz){N`lN7`*c*_>GsJ$!YlScS1BQJ=4+xarYtR_(85+1gO1IDE931bg z<@PwKZTrdivUee{J|pWaR~UaSW1tTcvR5xPyX}Us?vhE8mwihQtUX9qMG(7A7(Lo+ zNz>5R5Mk;Fm6!0sxW+2^P*a(I_Vw((^+oLd1s9P5eX?*FdiqYR)&4+{g4lY28>I>@ z2s19#6KzE;e>}X3GBvK7LLSQc!;%GN8cy)H2R+I*NGdi6Q7N>r zJ?)Y<{wFTwX~lo|UR>3QF}tHAR)2rhDykVbl9QAxJa)Uxz(O|Y_LJEU@_r`dID`x% zus*FY*=fu_;#0R>(Rqd4N+e*4;>aEhf$rFJET}>f0yLlP0+vs7BOC6s= zAjV;cx{VI8I@IN4P#;6KC|^LKv$b|^#cWXdJGcww;T@yv+!cXRHxip%e&)f3zo`@zMu^MNIQUq}?{QfxWT z;rDvAa8|C^#!ujyW+@D%3RLLKC$#6f-0)M!x-tW=B-dNnzY+gig>=&(By5n&QbIEF z_slyN7ZM#}^y96bQ~H9+pS%S_5tB+DufT-s_OS((vKvZwdz$~v#9P-qm_Q)UkmeFT z_^k+8XL=8xiHHWpEJai9q%L*DL_emHBI8YT)8yU>$B$(k>aGhH%Omw(Lk9^)Cki=~ zb|B>?4@Znd^`_9MgPNRQjPmM%*0_ZS)*=Y*()G{5T~$f)hOz;xwt9JD_h*r781c%3<&?!Cr{3N&a)1ETZxLmJEsPyMH8y)0(uK*w- zyvPXeQ{-lviKlkC@vH5hFRRn9you|H+;==ej|!&Z4`L z)BGEIR-%`1ToqG~)i+u=602*_mZ5ZxgQF3KL(OOX7E%{?L3ej)kN_JK5W2%NQ7uuY zn^Wd@Yk-CgV&U);5@8cFMG?PGa3BO6v~Gs4^vgLHAGbW}Fbm8|Ih-6I{;^H4lyOXe z>UF?m3DOkT2XZ2KJi@Q>BsR~tI}7(VTV=f$F0{&Zj11vIcyq1un12#;qvsI^**}H) Mr;ITrTFz1b1#*ROQ~&?~ literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Contents.json b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Contents.json new file mode 100644 index 0000000..ca5da25 --- /dev/null +++ b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "Star35.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "Star70.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "Star105.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star105.png b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star105.png new file mode 100644 index 0000000000000000000000000000000000000000..54fe294913a62871b484657c613ce25caf747497 GIT binary patch literal 3161 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 literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star70.png b/Stacks/Stacks/Assets.xcassets/ShortcutIcons/StarTemplate.imageset/Star70.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd119bbbdffe15fc4392c12fbb9cac0a982f74e GIT binary patch literal 2554 zcmZ{m3p~^N8^@QD&a^nfk!WkmI%1p4l3^O#O0Hp;9kMak&1RQ2A%BEJS{IyL%O$0i zbtu$vtFSstkYA_+04%Qv z_wwcXx;UeQm<%{2m`SC<1q_y44FK2((DFwHjZ1+D81yI(T3`!ZP@v_{3Nr!S2s1Mixx$1K6UC(nOrkgjAA@|3gQIbR*x@X0I5P^Oh)ba|d0bm4RFUZ4&!>Gd zSpO!9;(V$~ULQh0VIfT6NW|A5Zg|L-?fnm>@O%@a3BtdDDLfysg=T!*qm8_yXcuO1 zct{M6!lhx%kftaTQ=|zJR1Xo zFzHOTCyNq9Q}k;AS!7zOUPwdwR+>eQPoND#@h&fVw?7Wff>k~_7@+(_KTjbBxMKH@ z@ZxU&xHe#HCybwW@&om(S>?Edoal+|+U{vmE#PnDzhMSJbk8H!4--4GWrrA|=*yy^&8eve z_tNjWm~1;Y*|B>5&Y;)G7UEplv-KLac`czYe%+&$W+db@{^o~|2 zr)BE!Qo2v&v^=cV_femX?mPc@KZ)anZFp3j06%c7#SYlL+Tx}~s?WSRE@R3icU>-} zs-?+zW!+<=+#K^1pGMiF#*6iYwO0D`8e5-e#4x`f(rngJ`*|9_6Z0B9wdrdI7|0rrulJrYeXm8NVa(=519tTQxs0k|)T-6Z<2uC#$xd~g_ z@gr#?2{NAFN3#Y4)O0)hx43%O-p3)NpuWGi;)`zFszL2k>F?+ThGg^VpB23EOOBWnYFd<3 z5(|r8g43I<#w?37^e_m&j;`-y>#{7pwoVqV%s$p4#W{4s9NRpAq9LvWdFXe90)}L`n~Jtn}tN-9NyW?1bLP-^%Vkty!H@!gR(C zyq9QN80N&BQ0h}17I`Haj2yiqB{;#ZC1-2Z?i_GA&ex;YW+cCcsg_@X7?r1qPV4F(pjUS5M zErSmA#PvQQHwuiIW8URC-}x`K{6@@1 z>)?7Uo$YokvT;|`#j#C&e%C{2{_10`1FcV~WQe71n0o%ULzShf^Q768+&x)6z04W? nXVxA3;#WI{5}THn@rL(y7@bv@mj36V;t!c4-W4ad4@~+81iv+& literal 0 HcmV?d00001 diff --git a/Stacks/Stacks/Base.lproj/InfoPlist.strings b/Stacks/Stacks/Base.lproj/InfoPlist.strings new file mode 100644 index 0000000..5c672cd --- /dev/null +++ b/Stacks/Stacks/Base.lproj/InfoPlist.strings @@ -0,0 +1,15 @@ +/* + InfoPlist.strings + Stacks + + Created by Keith Harrison on 04/10/2015. + Copyright © 2015 Keith Harrison. All rights reserved. +*/ +shortcutTitleFavorites = "Favorites"; +shortcutSubtitleFavorites = "What you like"; + +shortcutTitleFeatured = "Featured"; +shortcutSubtitleFeatured = "What we like"; + +shortcutTitleTopRated = "Top Rated"; +shortcutSubtitleTopRated = "What others like"; diff --git a/Stacks/Stacks/Base.lproj/Main.storyboard b/Stacks/Stacks/Base.lproj/Main.storyboard index 800d60a..423d72d 100644 --- a/Stacks/Stacks/Base.lproj/Main.storyboard +++ b/Stacks/Stacks/Base.lproj/Main.storyboard @@ -1,5 +1,5 @@ - + @@ -22,16 +22,21 @@ + + + + + @@ -67,32 +72,40 @@ + + + + + + + @@ -126,6 +139,7 @@ + @@ -138,6 +152,7 @@ + @@ -149,9 +164,11 @@ + + @@ -177,6 +194,7 @@ + diff --git a/Stacks/Stacks/Info.plist b/Stacks/Stacks/Info.plist index f98366c..4abafdd 100644 --- a/Stacks/Stacks/Info.plist +++ b/Stacks/Stacks/Info.plist @@ -44,5 +44,53 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIApplicationShortcutItems + + + UIApplicationShortcutItemType + $(PRODUCT_BUNDLE_IDENTIFIER).OpenFavorites + UIApplicationShortcutItemTitle + shortcutTitleFavorites + UIApplicationShortcutItemSubtitle + shortcutSubtitleFavorites + UIApplicationShortcutItemIconFile + StarTemplate + UIApplicationShortcutItemUserInfo + + version + 2 + + + + UIApplicationShortcutItemType + $(PRODUCT_BUNDLE_IDENTIFIER).OpenFeatured + UIApplicationShortcutItemTitle + shortcutTitleFeatured + UIApplicationShortcutItemSubtitle + shortcutSubtitleFeatured + UIApplicationShortcutItemIconFile + EyeTemplate + UIApplicationShortcutItemUserInfo + + version + 2 + + + + UIApplicationShortcutItemType + $(PRODUCT_BUNDLE_IDENTIFIER).OpenTopRated + UIApplicationShortcutItemTitle + shortcutTitleTopRated + UIApplicationShortcutItemSubtitle + shortcutSubtitleTopRated + UIApplicationShortcutItemIconFile + HeartTemplate + UIApplicationShortcutItemUserInfo + + version + 2 + + + From 40587f7624b7e9218ebce33d0216064ffe998a8f Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 5 Oct 2015 22:51:14 +0100 Subject: [PATCH 007/194] Update Stacks README --- Stacks/README | 8 +++- Stacks/Stacks/Info.plist | 90 ++++++++++++++++++++-------------------- 2 files changed, 52 insertions(+), 46 deletions(-) diff --git a/Stacks/README b/Stacks/README index bb82643..d4bb551 100644 --- a/Stacks/README +++ b/Stacks/README @@ -1,6 +1,7 @@ ======================================================================= Stacks - Using stack views (requires iOS 9) +Version 1.3 05 Oct 2015 Add static quick actions Version 1.2 27 Sep 2015 Hide a view for compact height Version 1.1 06 July 2015 Adapting axis to view size classes Version 1.0 22 June 2015 Initial version. @@ -20,4 +21,9 @@ The third view controller - HiddenViewController is an example of how to use size classes to hide a view contained in a stack view. See this post for details: -http://useyourloaf.com/blog/using-size-classes-to-hide-stack-view-contents.html \ No newline at end of file +http://useyourloaf.com/blog/using-size-classes-to-hide-stack-view-contents.html + +Quick actions allow the user to launch the app directly to one of the three tabs. +See this post for details: + +http://useyourloaf.com/blog/adding-3d-touch-quick-actions.html \ No newline at end of file diff --git a/Stacks/Stacks/Info.plist b/Stacks/Stacks/Info.plist index 4abafdd..52811b9 100644 --- a/Stacks/Stacks/Info.plist +++ b/Stacks/Stacks/Info.plist @@ -15,82 +15,82 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.1 + 1.3 CFBundleSignature ???? CFBundleVersion - 2 + 3 LSRequiresIPhoneOS - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIRequiredDeviceCapabilities - - armv7 - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortraitUpsideDown - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - UIApplicationShortcutItems - UIApplicationShortcutItemType - $(PRODUCT_BUNDLE_IDENTIFIER).OpenFavorites - UIApplicationShortcutItemTitle - shortcutTitleFavorites - UIApplicationShortcutItemSubtitle - shortcutSubtitleFavorites UIApplicationShortcutItemIconFile StarTemplate + UIApplicationShortcutItemSubtitle + shortcutSubtitleFavorites + UIApplicationShortcutItemTitle + shortcutTitleFavorites + UIApplicationShortcutItemType + $(PRODUCT_BUNDLE_IDENTIFIER).OpenFavorites UIApplicationShortcutItemUserInfo version - 2 + 3 - UIApplicationShortcutItemType - $(PRODUCT_BUNDLE_IDENTIFIER).OpenFeatured - UIApplicationShortcutItemTitle - shortcutTitleFeatured - UIApplicationShortcutItemSubtitle - shortcutSubtitleFeatured UIApplicationShortcutItemIconFile EyeTemplate + UIApplicationShortcutItemSubtitle + shortcutSubtitleFeatured + UIApplicationShortcutItemTitle + shortcutTitleFeatured + UIApplicationShortcutItemType + $(PRODUCT_BUNDLE_IDENTIFIER).OpenFeatured UIApplicationShortcutItemUserInfo version - 2 + 3 - UIApplicationShortcutItemType - $(PRODUCT_BUNDLE_IDENTIFIER).OpenTopRated - UIApplicationShortcutItemTitle - shortcutTitleTopRated - UIApplicationShortcutItemSubtitle - shortcutSubtitleTopRated UIApplicationShortcutItemIconFile HeartTemplate + UIApplicationShortcutItemSubtitle + shortcutSubtitleTopRated + UIApplicationShortcutItemTitle + shortcutTitleTopRated + UIApplicationShortcutItemType + $(PRODUCT_BUNDLE_IDENTIFIER).OpenTopRated UIApplicationShortcutItemUserInfo version - 2 + 3 + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + UIInterfaceOrientationPortraitUpsideDown + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + From 4e4cc854b1d093bc8ab2ad54577cd24b3122d13a Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 8 Oct 2015 20:45:03 +0100 Subject: [PATCH 008/194] Refactor of country cell interface --- .../WorldFacts/Base.lproj/Main.storyboard | 64 +++++++++++++------ WorldFacts/WorldFacts/CountryCell.h | 6 +- WorldFacts/WorldFacts/CountryCell.m | 31 +++++++++ .../UYLCountryTableViewController.m | 11 +--- 4 files changed, 81 insertions(+), 31 deletions(-) diff --git a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard index 82b98ec..f48669d 100644 --- a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard +++ b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard @@ -1,7 +1,8 @@ - + - + + @@ -11,6 +12,7 @@ + @@ -33,90 +35,105 @@ + @@ -221,34 +238,39 @@ + - + - + + @@ -262,6 +284,7 @@ + @@ -289,6 +312,7 @@ + diff --git a/WorldFacts/WorldFacts/CountryCell.h b/WorldFacts/WorldFacts/CountryCell.h index 0c2df0b..d79ed4c 100644 --- a/WorldFacts/WorldFacts/CountryCell.h +++ b/WorldFacts/WorldFacts/CountryCell.h @@ -36,8 +36,8 @@ @interface CountryCell : UITableViewCell -@property (weak, nonatomic) IBOutlet UILabel *countryLabel; -@property (weak, nonatomic) IBOutlet UILabel *capitalLabel; -@property (weak, nonatomic) IBOutlet UILabel *populationLabel; +@property (copy, nonatomic) NSString *name; +@property (copy, nonatomic) NSString *capital; +@property (copy, nonatomic) NSString *population; @end diff --git a/WorldFacts/WorldFacts/CountryCell.m b/WorldFacts/WorldFacts/CountryCell.m index c1f1a38..5d452b1 100644 --- a/WorldFacts/WorldFacts/CountryCell.m +++ b/WorldFacts/WorldFacts/CountryCell.m @@ -34,5 +34,36 @@ #import "CountryCell.h" +@interface CountryCell () +@property (weak, nonatomic) IBOutlet UILabel *countryLabel; +@property (weak, nonatomic) IBOutlet UILabel *capitalLabel; +@property (weak, nonatomic) IBOutlet UILabel *populationLabel; +@end + @implementation CountryCell + +- (void)setName:(NSString *)name { + if (_name != name) { + _name = [name copy]; + _countryLabel.text =_name; + _countryLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; + } +} + +- (void)setCapital:(NSString *)capital { + if (_capital != capital) { + _capital = [capital copy]; + _capitalLabel.text =_capital; + _capitalLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + } +} + +- (void)setPopulation:(NSString *)population { + if (_population != population) { + _population = [population copy]; + _populationLabel.text =_capital; + _populationLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; + } +} + @end diff --git a/WorldFacts/WorldFacts/UYLCountryTableViewController.m b/WorldFacts/WorldFacts/UYLCountryTableViewController.m index fc0bd5a..cb9f3dc 100644 --- a/WorldFacts/WorldFacts/UYLCountryTableViewController.m +++ b/WorldFacts/WorldFacts/UYLCountryTableViewController.m @@ -211,16 +211,11 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N country = [self.fetchedResultsController objectAtIndexPath:indexPath]; } - cell.countryLabel.text = country.name; - cell.capitalLabel.text = country.capital; + cell.name = country.name; + cell.capital = country.capital; NSString *population = [self.decimalFormatter stringFromNumber:country.population]; - cell.populationLabel.text = [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"PopulationShortLabel", @"Pop:"), population]; - - cell.countryLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; - cell.capitalLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; - cell.populationLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; - + cell.population = [NSString stringWithFormat:@"%@ %@", NSLocalizedString(@"PopulationShortLabel", @"Pop:"), population]; return cell; } From 01a507ea81ebebd792a6ac344525433723b06b8f Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 10 Oct 2015 15:58:29 +0100 Subject: [PATCH 009/194] Add peek and pop --- .../WorldFacts/Base.lproj/Main.storyboard | 34 ++++---- WorldFacts/WorldFacts/CountryCell.m | 2 +- .../UYLCountryTableViewController.m | 80 +++++++++++++++---- 3 files changed, 82 insertions(+), 34 deletions(-) diff --git a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard index f48669d..231a79f 100644 --- a/WorldFacts/WorldFacts/Base.lproj/Main.storyboard +++ b/WorldFacts/WorldFacts/Base.lproj/Main.storyboard @@ -35,98 +35,98 @@ + + + + + + + + + + + + + + + @@ -120,7 +141,7 @@ - + @@ -240,6 +261,25 @@ + + + + + + + + + + + + + + + + + + + @@ -256,6 +296,24 @@ + + + + + + + + + + + + + + + + + + diff --git a/AutoLayout/AutoLayout/LayoutAnchorController.swift b/AutoLayout/AutoLayout/LayoutAnchorController.swift new file mode 100644 index 0000000..9ad2bea --- /dev/null +++ b/AutoLayout/AutoLayout/LayoutAnchorController.swift @@ -0,0 +1,118 @@ +// +// LayoutAnchorController.swift +// AutoLayout +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2016 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class LayoutAnchorController: UIViewController { + + let stackView = UIStackView() + + override func viewDidLoad() { + super.viewDidLoad() + setupViews() + } + + func setupViews() { + + stackView.translatesAutoresizingMaskIntoConstraints = false + stackView.distribution = .EqualSpacing + view.addSubview(stackView) + + stackView.addImageViewForImage("Heart") + stackView.addImageViewForImage("Star") + stackView.addImageViewForImage("Heart") + +// Constraints to pin the stack view to the leading and trailing +// margins of the superview and below the top layout guide. + +// The code below shows three different ways to achieve this: + +// 1. Using the NSLayoutConstraint class method to create +// each individual constraint. The most verbose of the +// three approaches. +// +// NSLayoutConstraint(item: stackView, +// attribute: .Leading, +// relatedBy: .Equal, +// toItem: view, +// attribute: .LeadingMargin, +// multiplier: 1, +// constant: 0).active = true +// +// NSLayoutConstraint(item: stackView, +// attribute: .Trailing, +// relatedBy: .Equal, +// toItem: view, +// attribute: .TrailingMargin, +// multiplier: 1, +// constant: 0).active = true +// +// NSLayoutConstraint(item: stackView, +// attribute: .Top, +// relatedBy: .Equal, +// toItem: topLayoutGuide, +// attribute: .Bottom, +// multiplier: 1, +// constant: 8.0).active = true + +// 2. Using the Visual Format Language to add both constraints +// in one go. Shorter but still not very readable. + +// let views: [String: AnyObject] = +// ["stackView" : stackView, +// "topLayoutGuide" : topLayoutGuide] +// +// let h = NSLayoutConstraint.constraintsWithVisualFormat( +// "|-[stackView]-|", +// options: [], +// metrics: nil, +// views: views) +// NSLayoutConstraint.activateConstraints(h) +// +// let v = NSLayoutConstraint.constraintsWithVisualFormat( +// "V:|[topLayoutGuide]-[stackView]", +// options: [], +// metrics: nil, +// views: views) +// NSLayoutConstraint.activateConstraints(v) + +// 3. Using layout anchors - by far the easiest method but requires +// iOS 9. + + let margins = view.layoutMarginsGuide + + stackView.leadingAnchor.constraintEqualToAnchor(margins.leadingAnchor).active = true + stackView.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true + stackView.topAnchor.constraintEqualToAnchor(topLayoutGuide.bottomAnchor, constant: 8.0).active = true + } +} diff --git a/AutoLayout/README b/AutoLayout/README index 7261693..fd2a564 100644 --- a/AutoLayout/README +++ b/AutoLayout/README @@ -1,15 +1,17 @@ -AutoLayout -========== +### AutoLayout +Version 1.2 22 Feb 2016 Example of using layout anchors Version 1.1 31 Jan 2016 Custom Asset catalog for size classes. Version 1.0 15 Jan 2016 Initial Version -Example of how to use center constraints to proportionally -space views along horizontal or vertical axis. +Auto Layout examples using Interface Builder and in code. -Solution is implemented with Interface Builder, in code and -with a stack view. ++ Proportional spacing using Interface Builder ++ Proportional spacing using code ++ Proportional spacing using a stack view ++ Layout Anchors -See this post for further details: +See the following posts further details: -http://useyourloaf.com/blog/proportional-spacing-with-auto-layout.html \ No newline at end of file ++ [Proportional Spacing with Auto Layout](http://useyourloaf.com/blog/proportional-spacing-with-auto-layout/) ++ [Adapting Images for Size Classes](http://useyourloaf.com/blog/adapting-images-for-size-classes/) \ No newline at end of file From 450b19388d095a6ae769f18da489678b1e293e1b Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 22 Feb 2016 11:41:18 +0000 Subject: [PATCH 028/194] use markdown for README --- AutoLayout/AutoLayout.xcodeproj/project.pbxproj | 4 ++-- AutoLayout/{README => README.md} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename AutoLayout/{README => README.md} (100%) diff --git a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj index 5f6ff42..e081145 100644 --- a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj +++ b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj @@ -34,7 +34,7 @@ 53EDF4091C5D64C0009F91EA /* UIStackView+addView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIStackView+addView.swift"; sourceTree = ""; }; 53EDF40B1C5D6641009F91EA /* UIViewController+addView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+addView.swift"; sourceTree = ""; }; 53EDF40E1C5D66AA009F91EA /* UIViewController+Constraint.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "UIViewController+Constraint.swift"; sourceTree = ""; }; - 53EDF4101C5D77A7009F91EA /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; + 53EDF4101C5D77A7009F91EA /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -51,7 +51,7 @@ 53D6A5E41C53BF5200A81A14 = { isa = PBXGroup; children = ( - 53EDF4101C5D77A7009F91EA /* README */, + 53EDF4101C5D77A7009F91EA /* README.md */, 53D6A5EF1C53BF5200A81A14 /* AutoLayout */, 53D6A5EE1C53BF5200A81A14 /* Products */, ); diff --git a/AutoLayout/README b/AutoLayout/README.md similarity index 100% rename from AutoLayout/README rename to AutoLayout/README.md From 98ef21bc50729e3c8b49280470976e32f4b0ff74 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 22 Feb 2016 11:44:06 +0000 Subject: [PATCH 029/194] markdown formatting --- AutoLayout/README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/AutoLayout/README.md b/AutoLayout/README.md index fd2a564..6b2680b 100644 --- a/AutoLayout/README.md +++ b/AutoLayout/README.md @@ -1,9 +1,5 @@ ### AutoLayout -Version 1.2 22 Feb 2016 Example of using layout anchors -Version 1.1 31 Jan 2016 Custom Asset catalog for size classes. -Version 1.0 15 Jan 2016 Initial Version - Auto Layout examples using Interface Builder and in code. + Proportional spacing using Interface Builder @@ -14,4 +10,10 @@ Auto Layout examples using Interface Builder and in code. See the following posts further details: + [Proportional Spacing with Auto Layout](http://useyourloaf.com/blog/proportional-spacing-with-auto-layout/) -+ [Adapting Images for Size Classes](http://useyourloaf.com/blog/adapting-images-for-size-classes/) \ No newline at end of file ++ [Adapting Images for Size Classes](http://useyourloaf.com/blog/adapting-images-for-size-classes/) + +#### Version History + ++ Version 1.2 22 Feb 2016 Example of using layout anchors ++ Version 1.1 31 Jan 2016 Custom Asset catalog for size classes. ++ Version 1.0 15 Jan 2016 Initial Version \ No newline at end of file From 7cbc84b7f08618ee6c8eafe515eef63e19630612 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 27 Feb 2016 20:27:29 +0000 Subject: [PATCH 030/194] Add Layout Guide example --- .../AutoLayout.xcodeproj/project.pbxproj | 6 + .../Assets.xcassets/Buttons/Contents.json | 6 + .../greenButton.imageset/Contents.json | 23 +++ .../Buttons/greenButton.imageset/green.pdf | Bin 0 -> 12238 bytes .../Buttons/redButton.imageset/Contents.json | 23 +++ .../Buttons/redButton.imageset/red.pdf | Bin 0 -> 12248 bytes .../AutoLayout/Base.lproj/Main.storyboard | 70 +++++++++- .../AutoLayout/LayoutGuideController.swift | 131 ++++++++++++++++++ AutoLayout/README.md | 3 + 9 files changed, 256 insertions(+), 6 deletions(-) create mode 100644 AutoLayout/AutoLayout/Assets.xcassets/Buttons/Contents.json create mode 100644 AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/Contents.json create mode 100644 AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/green.pdf create mode 100644 AutoLayout/AutoLayout/Assets.xcassets/Buttons/redButton.imageset/Contents.json create mode 100644 AutoLayout/AutoLayout/Assets.xcassets/Buttons/redButton.imageset/red.pdf create mode 100644 AutoLayout/AutoLayout/LayoutGuideController.swift diff --git a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj index e081145..464d35e 100644 --- a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj +++ b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj @@ -8,6 +8,7 @@ /* Begin PBXBuildFile section */ 5329F1161C79008300A35954 /* LayoutAnchorController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5329F1151C79008300A35954 /* LayoutAnchorController.swift */; }; + 53358D6F1C80F0B100C1842A /* LayoutGuideController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53358D6E1C80F0B100C1842A /* LayoutGuideController.swift */; }; 5362E7F81C53F1B200DAA88B /* CenterAlignViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5362E7F71C53F1B200DAA88B /* CenterAlignViewController.swift */; }; 53D6A5F11C53BF5200A81A14 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D6A5F01C53BF5200A81A14 /* AppDelegate.swift */; }; 53D6A5F31C53BF5200A81A14 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D6A5F21C53BF5200A81A14 /* MasterViewController.swift */; }; @@ -22,6 +23,7 @@ /* Begin PBXFileReference section */ 5329F1151C79008300A35954 /* LayoutAnchorController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutAnchorController.swift; sourceTree = ""; }; + 53358D6E1C80F0B100C1842A /* LayoutGuideController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutGuideController.swift; sourceTree = ""; }; 5362E7F71C53F1B200DAA88B /* CenterAlignViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = CenterAlignViewController.swift; sourceTree = ""; tabWidth = 4; }; 53D6A5ED1C53BF5200A81A14 /* AutoLayout.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AutoLayout.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53D6A5F01C53BF5200A81A14 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -55,7 +57,9 @@ 53D6A5EF1C53BF5200A81A14 /* AutoLayout */, 53D6A5EE1C53BF5200A81A14 /* Products */, ); + indentWidth = 4; sourceTree = ""; + tabWidth = 4; }; 53D6A5EE1C53BF5200A81A14 /* Products */ = { isa = PBXGroup; @@ -73,6 +77,7 @@ 53D6A5F21C53BF5200A81A14 /* MasterViewController.swift */, 5362E7F71C53F1B200DAA88B /* CenterAlignViewController.swift */, 5329F1151C79008300A35954 /* LayoutAnchorController.swift */, + 53358D6E1C80F0B100C1842A /* LayoutGuideController.swift */, 53EDF4071C5D5C78009F91EA /* StackViewController.swift */, 53D6A5F61C53BF5200A81A14 /* Main.storyboard */, 53D6A5F91C53BF5200A81A14 /* Assets.xcassets */, @@ -166,6 +171,7 @@ 53EDF40F1C5D66AA009F91EA /* UIViewController+Constraint.swift in Sources */, 53EDF40A1C5D64C1009F91EA /* UIStackView+addView.swift in Sources */, 53D6A5F31C53BF5200A81A14 /* MasterViewController.swift in Sources */, + 53358D6F1C80F0B100C1842A /* LayoutGuideController.swift in Sources */, 53EDF4081C5D5C78009F91EA /* StackViewController.swift in Sources */, 5329F1161C79008300A35954 /* LayoutAnchorController.swift in Sources */, 53EDF40C1C5D6641009F91EA /* UIViewController+addView.swift in Sources */, diff --git a/AutoLayout/AutoLayout/Assets.xcassets/Buttons/Contents.json b/AutoLayout/AutoLayout/Assets.xcassets/Buttons/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/AutoLayout/AutoLayout/Assets.xcassets/Buttons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/Contents.json b/AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/Contents.json new file mode 100644 index 0000000..30dee8d --- /dev/null +++ b/AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "green.pdf", + "resizing" : { + "mode" : "3-part-horizontal", + "center" : { + "mode" : "stretch", + "width" : 1 + }, + "cap-insets" : { + "right" : 20, + "left" : 20 + } + } + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/green.pdf b/AutoLayout/AutoLayout/Assets.xcassets/Buttons/greenButton.imageset/green.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b3fa12c24fd4dd1bf4fdc3bbfbe0807c05b03373 GIT binary patch literal 12238 zcmeHNc|25a+ec#?DzX&$)k&eU%#Nw-dla&7F&I0;*o!P#A|-od38j=ZvSyb^H5HP| zo+w+EkR|UKOC`OZ=lA@c_j&(n%*UK_pL@B^_qwm^zBV2;S$RQ(5DLmuKQK8kd~53Z z^ZEuT8h`@?Qyb{9V*pGA?_lX-1z^CYQvgif+Rg<}1b^*tE_hkI8NnP6h>Js=U5I#` zJ=BBpX>60jZUke{_!(%W@1r+yUH4e!{MZ$r%RCE=5T;JN5z;BsT`6(slDu$F?Z?ck zb!ui#%wHoW89HAwWW$6U#48r=Emu_B`ttPE^MNmI6Weu2stXIZ#Ei~4NOZodav1X& z^YQL{IlTRhx;)=Y53d8kmQ#wu;o(6!DY%fN2ZYdA|CotDdj_EPyEdxSTUoqaZJ4L`!=-EQYpR5EnO5H!S1sVkF`aey zRm6J->CrLs?mo=eQjNDXI%9r0C0ki}&oik&tkp7ZTUuglbCbYzp9v4fW1)8>lFVk1P14pb&T4p~48h)!;6UcD=x??dWp^B?SdV?e#CJ_OyfxlDKML z$}KdEyWl4O=;HHsMr;lR<>t*vhJuWasOb8pS>ebpfPp(}n%=S-7EVpSb7l=GqUa07HJ|}vsq9UiLNO(#Ot>XRQ zc+~jNP|qPpC4%g;=%PzH+$_B*)E_a?*%SLaP~v>G5&G00_MD+hqY_V13#eUs7Hy?b~4)2B}@UNoX7pu9q^Mb*c27KY5zsSWNlO$+NE6t1eM$Y$74 zR8-Vxa_pie|54pj;6TFwldnVHeIn;d4HBb{7WSWqF}T^cHg zD7|@kFo)R8SF@Lki|enydV_<5OLQ{w5qjU|=H}kNhbS2P?_!P!0@@$P(N7wmKdGwf zNsFcCnBCuT#=x`sI4c}U+l;1^q@*RfBN7tDSv1AG+vq3TY`*mM zQN?*sQe8SOPi@F=zuV=00;`Xw=U0>>WwGR_LbCFSdy8#tZMguoVVZ5jeBA8B)gm$v zy|T5-OG`^DD;v};ZjjL1!ykU|5pg|x_HEb~f<^1&IB>glcXlq(pUR84oP}_+e_FRa zl(b9@A?l$v3;K!(lf_y@bmb}eaz)|(D(Y(@_%}rz`9svf%YR4I*Uq$mBY{*bt75i`+>c39Q}&a+8g}Wky<;h{v)JjRqg*Hq>$*} zogRpF3*!e;$n~b5JPhQTS@4gL`fd>^ztp# z9|jE`skC~DN>}7RcTR~jmK80~`!esgB3hh^7J8lH$JdcPFENj$xvYg@u(LC+FX!|N0?+K`FMQqL;yTM(Lvo8xZyN{9%h|MG{bvna7EjLeGfIq35+=jvg zmbr$#a(!K?ocOlVe@HgtfXvo!PW=gHc6Z0-txv~V8&b9&WIP+pAv^Bs^L@0_v{0%nlzr3IMdGZgb-4j7}(j?9oM5%)OR8*)Y_pX z>Wg9EHAFI_)acSx_@h&m(=A?xFCRx+9`19D8hB;@g*kTM$gHbp{wK@RqtR9oLj2gip&MWLYnV9+19cNt+Mb6g8UH9Iax4%(jwBQ8N$QCBn z6Ri;C@r`D9m_zF~%wG2lkfO-%%w9LherEQXwfi@jy-_9qcbPpJo4<`>ADv7udYi*8 znLdZbWz`3JMTJKk5A8o7=q+$z@zx&MXxjd?3j$0mvP@^LP|*MQO7c=Rre|TC2Ndtl zSVeY>@7EA~$;sfj%cv!ddU9U)ZGPmf*_)ap=n3ZvLs{?c`yDxxRLZ)0?0*9!8K4!Z zL3}r3SB&ppG&XY0!T6g%ZZ!P=%RpYOfCj*s0@|+vZrpR{*=I7?WiPM`Yo{r&PJM$B zlU);l@`n+J;;!H%PMOnC=r&T{@o4N}z8INyhgpkFY1$+IAYs8ty7hJOR}z0uW}=8U zaGX$};z=Rk(0YzT)2Q6Wlm^Eg$I>=bxoBv&3u4FAOPAoYdg z)?WPCci!GfKA4p;pMT_Y@sS5@M;rI_96i^tWtu_|vRIHO>BQmbD^w_8DJIFl8W%x3 zB;8D$siKVZzCqtlX*9Gij2J)}19xMIrI*x+c*n+~HzA{A=}npM|Ag*0d?WLN%p)Z7 z$4UFMzqZP#AATlG`UC(|b;A?wz!Ttyi?`xxuJd}+7&9CI7eZr&MSdQ!zGKK@wmM?X z&Gb~Uc6I?^8ZMr8tA6e3)7ASQKB9&d&Ya*55@TWEyy8_O;20?U7x#JH9bDNupyy5Y zRKY(X1O_gQ#-PF88$8t&Pj=&L{KrILSBW}>Gq-ki20+#DV;h66ElAC&wWgoQLt)^e zNMXz-^2pBh|1o+08Z$7E0RF*+FmN~uD~$S;C=~e})`?nk?@?PQDFra<@vnlNNwMyl8XfGxqzaLW=R3Foo@vfA^uWubifj<|5G7wVs-OT~H(6?V zR^~(6=9<-%3c=iFa;yyJ{Y~5HCz;e5YSd-r20FuR>BqA%Q(Xy5kMz1b28-J}EXTdu z%P7=VH)B6EO-0xH)geC!_9$Ysdm>6k;vAOw;`)alG$SIrW}#JU}Ohm8*3n@bspKK~fE`^7L4yd(q-6G?fx424)Yo zw9F-{P{3K^jh_tirrL!dVwtSs*dhG z=QNhY8qX|fP4JG8lBL3u^}6jwvS1bL6f+0(ul-d}8KXr}XipQUab(2KnKH#zh<`|AA;q8YxGD%c8{a&(pnWuBr-a{rB{mdZZXn}U zhO+FFCyd+TNajnkOw0Y%SnH=vbpnYg)jKBwhqTm(qUi%dtjYtA`RQH}GKU8EwDtPz z66T}jIG1G0YUOH7;T?!oD^a3tB#2SS?B8<0LE;RR_pkvI0@_&lz$!Z;*Et+{=G)-> zUIxQZhh7yaZjBE!jN#@)o-_fD^zHz=8mb*vXkD&D(SAa3Dgl$NT)rsBEnNUbfUhFc zme?&qid5E;kb6?%uPLBXh}V>E=WQG*TK&#Ehn(~mcBCA!WK*@zpwr`P22J_bosI*+~|dwuU!(X z*ER_^G02O{-|`waa+GV^qiT*mF2{2vy9|*Im>fv)_V%!H-{HEgy}T114-R*+j{9$~ zasF)TwXYKD!{xK5JA7|L72g$leTc39_IqVUKY{2TaR3L-ZaTB1Ha zoZdTBF-?!>!5a)59N-$@94L5vil!EBGKV_FaWgC`tUN4y3jLv!)K7XVoNIl0`N5%> zuZJBDd&O|aSj14qgx^uoBDAr#CEc;VquL6$;kCipbl5Dk3EjO!xS*rzDY1kOrM4o)r3ICKMsBf%k|DPbUC5dEmoN}u6AM1Mek@cwCd zO#IjrO$(lai`dlcoY7l?FT`(j-WAI>yIr7bnSQe18H-V*kb#I)v0<@>yR@n@Oc!RH zt3IA8uAY*ea-&M2%E0Gw^>g5j$wjGaHMdhkQ>$>vxb$AL{dXenzBrt&pMJDK)U3!U zbV9t}fHyBBNhwn4Qqu{I*R5TeCS{~T5~J-0D_-1RvB0Q+hTyQkUcEzl)VlVCpYrDG-qa`98ku=N3bN@pD|nXC`Qd(c zreL>Q)u{K;1f#r8_VSbEq?v6q+zY%52wJgVkKl@Jv#(v;4weUaw=oY7^_D!F2kFOuzo{{F4*y zmj>PH?dv;Vi*+oOEbwnv-X5WF@lo`xs6kE=!|4lgxjGR#xy6yQrsFo_x5ST#hlpPi zXQ_0nyz32{!!1!Qxy^S@wSOL*Z(mS_h(faHhoCng@(^uWaRwy)4r*6OT@7VTx&L0+ zOXCBEt?X3Ni!yG3$LKMPMr`xWyMzSLS-c~jC0ZWmJlr9IrgE|}_2r7;jV~J&E?#0+ zW_OowQg|rWrf@>;tX!O&a-6P!Ucr0$F#RwfLyUdzZnm=r+=!X8FFTck`$zhq{bNEX z!`On6H^ln`na!k}E52R5{$JT9QS}bXjFCtV9I_p`KU%mWI<%?q2fonYH^%x3l?sZuz z;8Px}KVkkb{XXHnL-SuvQ%wu!FcuhhSIbJbZ$XPSm@(UJ*@3Te4BwWXbT_Ig>-|zW z9BvQTD|UQtmT$g<-`(vH+SRIlT|KYT#HwKYLxXgww0dua;4_15b`R~?>_$5+3bJk9 z#&Ms1@x`>cFSJjU=UwD*x1P7o*Ul$10izW+XKpUI_qfryzw7*1Hl-VHs&~5Mc}|Z} z_P~?Lw8`RfosmjyoPm?ccI$BS@IvJ6dlkoXZ4}yWeY)|bCc3p}e%^A+7ixR;~v=jk9XD*;4ioaqoJw>PW+BpUSE%eT;o%M-?X`ND6@pHy_o8 zyS5!|Z5O#M5-nVNDY7BI-{}!ysppH#S(dvW)lliBa}d#e*onSJb9={=8IN^%hI-%m z$hVX-Q}kRvR6q6AyH_DaH-xRvs+{fq=-ZO?*R#I_C9W-dO^40ICloxkR3=3{V@te- zO>sXrDcuk_aWQ0P@DUvs@v_4AFOzcea=M!R;&M+>yP)x?JGVy7A(c~XJ4+Q_8y!!T7Y%Ulz9(aUQXJ*6;p96K*-LG6?G~98(<9g0O-Kb7EW?9J zWMIoNUvpLKs7aY5e)&TAPYT%zq_D4HooDi=AAW8Qi)-l*tUC0qXg21>-IR0g3l)~8 zP4%B`Ukt}f9PheaiJgBnV?Ss<^uER2dOYJ+XxH6Ji5b78)CIHYM-d-KROeJru}2n{;_HQ*tCCa+W$|R_It$sC!2O9j!ZUm zHyE|6B||@q+MnXIYXNt#0L}S-DPkiBrCq^FDFgshwl;SLgVSr%{S?DT{hSwFol*wp zg0mx7u9nj|uh-FO7t9BkyPAPzx+pS{~onpBww3MbVqaqJJ|V z29Dk|9|qhzo907dHn)k0Y-&Scke~zl3oUT?rZrHA%`}5qq2G+%%wIH$?D%e61Kdzx zo@Qg4C>%^N{o01uG#|)I^4{Js76HeKY-&Tm(Z8;XKx|$E+|T56;l}w82+U9Xa3SKX z?eN5v8hH)tGoTz{0oW-50W8cVs~k}3lpHJw`5IPsYz^w6$t~xT+0wF0AFGbM z_B^C_YFiRvXt6uH;=O)j&9SmHJI|?u8de5(j0~95OsfV3&b*!w?npIc=?CZ3KH*W~ zO;p)=sP7EV($%Gq#nM!salI+kLUyQFlIMGmqGsRn*Td?a9?UO=2s%n8oWhAA)z@W$ z9%#SgH>{(Re%q^=Jz1QyZ0Ap(aLZmG`u0Q>Pi?)K;ps}fQHTxte)y%*QBgJ>-gxVB z6A7C{2{Nb*YMm(Y3S_cHnD5X8%a|FDc*I-d7MjHO~m5p`9ZNC9$EsI_l zWJzRnUOpk-Cof(9kZxSl>pf%jt~{|#-G`0bN+0L41tjVY)GKG1?^Lq4QGZn_y7=(z zRerbNzT3{Vv>XAEx=v?hqgAHv^*^X)+EGR~bMMð5<+&o`K4sm0qB5^p38KoN&T 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 LEGVd=tqT4hi~a(0 literal 0 HcmV?d00001 diff --git a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard index 072a09c..c689bb2 100644 --- a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard +++ b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard @@ -19,7 +19,7 @@ - + @@ -32,7 +32,7 @@ - + @@ -129,6 +129,27 @@ + + + + + + + + + + + + + + + @@ -137,11 +158,11 @@ - + - + @@ -278,7 +299,7 @@ - + @@ -312,7 +333,44 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AutoLayout/AutoLayout/LayoutGuideController.swift b/AutoLayout/AutoLayout/LayoutGuideController.swift new file mode 100644 index 0000000..28ce349 --- /dev/null +++ b/AutoLayout/AutoLayout/LayoutGuideController.swift @@ -0,0 +1,131 @@ +// +// LayoutGuideController.swift +// AutoLayout +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2016 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class LayoutGuideController: UIViewController { + + // Use layout guides as an alternative to spacer views + // The two buttons will be placed between the view margins + // with equal spacing between the buttons and the margins + // so that the width of the three guides is equal. + + // = |+++++++++++************+++++++++++************+++++++++++| = + // = |+ leading +* no *+ middle +* yes *+ trailing+| = + // = |+ guide +* button *+ guide +* button *+ guide +| = + // = |+++++++++++************+++++++++++************+++++++++++| = + + let leadingGuide = UILayoutGuide() + let noButton = UIButton(type: .Custom) + let middleGuide = UILayoutGuide() + let yesButton = UIButton(type: .Custom) + let trailingGuide = UILayoutGuide() + + override func viewDidLoad() { + super.viewDidLoad() + setupViews() + setupConstraints() + } + + private func setupViews() { + + // Configure the buttons and add them to the superview + + noButton.translatesAutoresizingMaskIntoConstraints = false + noButton.setTitle("No", forState: .Normal) + let redImage = UIImage(named: "redButton") + noButton.setBackgroundImage(redImage, forState: .Normal) + noButton.contentEdgeInsets = UIEdgeInsetsMake(8, 16, 8, 16) + noButton.addTarget(self, action: "noThanks:", forControlEvents: .TouchUpInside) + + yesButton.translatesAutoresizingMaskIntoConstraints = false + yesButton.setTitle("Yes please!", forState: .Normal) + let greenImage = UIImage(named: "greenButton") + yesButton.setBackgroundImage(greenImage, forState: .Normal) + yesButton.contentEdgeInsets = UIEdgeInsetsMake(8, 16, 8, 16) + yesButton.addTarget(self, action: "yesPlease:", forControlEvents: .TouchUpInside) + + view.addSubview(noButton) + view.addSubview(yesButton) + + // Add the layout guides to the view + // Note that the guides are not part of the + // view hierarchy + + view.addLayoutGuide(leadingGuide) + view.addLayoutGuide(middleGuide) + view.addLayoutGuide(trailingGuide) + } + + private func setupConstraints() { + + // The views are spaced relative to the margings of + // the superview. To space the views relative to the + // edges of the super view replace "margings" with + // "view" in the constraints below + + let margins = view.layoutMarginsGuide + + // leading to trailing constraints + // working from left to right + + margins.leadingAnchor.constraintEqualToAnchor(leadingGuide.leadingAnchor).active = true + leadingGuide.trailingAnchor.constraintEqualToAnchor(noButton.leadingAnchor).active = true + noButton.trailingAnchor.constraintEqualToAnchor(middleGuide.leadingAnchor).active = true + middleGuide.trailingAnchor.constraintEqualToAnchor(yesButton.leadingAnchor).active = true + yesButton.trailingAnchor.constraintEqualToAnchor(trailingGuide.leadingAnchor).active = true + trailingGuide.trailingAnchor.constraintEqualToAnchor(margins.trailingAnchor).active = true + + // The buttons should have the same width + noButton.widthAnchor.constraintEqualToAnchor(yesButton.widthAnchor).active = true + + // The guides should have the same width + leadingGuide.widthAnchor.constraintEqualToAnchor(middleGuide.widthAnchor).active = true + leadingGuide.widthAnchor.constraintEqualToAnchor(trailingGuide.widthAnchor).active = true + + // Center everything vertically in the super view + leadingGuide.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true + middleGuide.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true + trailingGuide.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true + noButton.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true + yesButton.centerYAnchor.constraintEqualToAnchor(view.centerYAnchor).active = true + } + + func noThanks(sender: UIButton) { + print("No thanks!") + } + + func yesPlease(sender: UIButton) { + print("Yes please!") + } +} diff --git a/AutoLayout/README.md b/AutoLayout/README.md index 6b2680b..453c261 100644 --- a/AutoLayout/README.md +++ b/AutoLayout/README.md @@ -6,14 +6,17 @@ Auto Layout examples using Interface Builder and in code. + Proportional spacing using code + Proportional spacing using a stack view + Layout Anchors ++ Layout Guides as spacer views See the following posts further details: + [Proportional Spacing with Auto Layout](http://useyourloaf.com/blog/proportional-spacing-with-auto-layout/) + [Adapting Images for Size Classes](http://useyourloaf.com/blog/adapting-images-for-size-classes/) ++ [Pain Free Constraints with Layout Anchors](http://useyourloaf.com/blog/pain-free-constraints-with-layout-anchors/) #### Version History ++ Version 1.3 27 Feb 2016 Using layout guides to space views + Version 1.2 22 Feb 2016 Example of using layout anchors + Version 1.1 31 Jan 2016 Custom Asset catalog for size classes. + Version 1.0 15 Jan 2016 Initial Version \ No newline at end of file From 41cc7f5937d6549ea78e5a1d61245c375455eb67 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 7 Mar 2016 20:48:39 +0000 Subject: [PATCH 031/194] Add Buttons project --- Buttons/Buttons.xcodeproj/project.pbxproj | 294 ++++++++++++++++++ Buttons/Buttons/AppDelegate.swift | 41 +++ .../AppIcon.appiconset/Contents.json | 73 +++++ .../Button Images - No Slicing/Contents.json | 6 + .../unslicedBorder.imageset/Contents.json | 12 + .../unslicedBorder.imageset/border.pdf | Bin 0 -> 4065 bytes .../unslicedFill.imageset/Contents.json | 12 + .../unslicedFill.imageset/filled.pdf | Bin 0 -> 4099 bytes .../Button Templates - Sliced/Contents.json | 6 + .../Contents.json | 29 ++ .../slicedBorderTemplate.imageset/border.pdf | Bin 0 -> 4065 bytes .../slicedFillTemplate.imageset/Contents.json | 29 ++ .../slicedFillTemplate.imageset/filled.pdf | Bin 0 -> 4099 bytes Buttons/Buttons/Assets.xcassets/Contents.json | 6 + .../Base.lproj/LaunchScreen.storyboard | 27 ++ Buttons/Buttons/Base.lproj/Main.storyboard | 75 +++++ Buttons/Buttons/Info.plist | 47 +++ Buttons/Buttons/ViewController.swift | 68 ++++ 18 files changed, 725 insertions(+) create mode 100644 Buttons/Buttons.xcodeproj/project.pbxproj create mode 100644 Buttons/Buttons/AppDelegate.swift create mode 100644 Buttons/Buttons/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/border.pdf create mode 100644 Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/filled.pdf create mode 100644 Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/border.pdf create mode 100644 Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/Contents.json create mode 100644 Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/filled.pdf create mode 100644 Buttons/Buttons/Assets.xcassets/Contents.json create mode 100644 Buttons/Buttons/Base.lproj/LaunchScreen.storyboard create mode 100644 Buttons/Buttons/Base.lproj/Main.storyboard create mode 100644 Buttons/Buttons/Info.plist create mode 100644 Buttons/Buttons/ViewController.swift diff --git a/Buttons/Buttons.xcodeproj/project.pbxproj b/Buttons/Buttons.xcodeproj/project.pbxproj new file mode 100644 index 0000000..468cb69 --- /dev/null +++ b/Buttons/Buttons.xcodeproj/project.pbxproj @@ -0,0 +1,294 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 5323B0B81C88D97300B183DD /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5323B0B71C88D97300B183DD /* AppDelegate.swift */; }; + 5323B0BA1C88D97300B183DD /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5323B0B91C88D97300B183DD /* ViewController.swift */; }; + 5323B0BD1C88D97300B183DD /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5323B0BB1C88D97300B183DD /* Main.storyboard */; }; + 5323B0BF1C88D97300B183DD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5323B0BE1C88D97300B183DD /* Assets.xcassets */; }; + 5323B0C21C88D97300B183DD /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5323B0C01C88D97300B183DD /* LaunchScreen.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 5323B0B41C88D97300B183DD /* Buttons.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Buttons.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 5323B0B71C88D97300B183DD /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 5323B0B91C88D97300B183DD /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 5323B0BC1C88D97300B183DD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 5323B0BE1C88D97300B183DD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 5323B0C11C88D97300B183DD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 5323B0C31C88D97300B183DD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 5323B0B11C88D97300B183DD /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 5323B0AB1C88D97300B183DD = { + isa = PBXGroup; + children = ( + 5323B0B61C88D97300B183DD /* Buttons */, + 5323B0B51C88D97300B183DD /* Products */, + ); + sourceTree = ""; + }; + 5323B0B51C88D97300B183DD /* Products */ = { + isa = PBXGroup; + children = ( + 5323B0B41C88D97300B183DD /* Buttons.app */, + ); + name = Products; + sourceTree = ""; + }; + 5323B0B61C88D97300B183DD /* Buttons */ = { + isa = PBXGroup; + children = ( + 5323B0B71C88D97300B183DD /* AppDelegate.swift */, + 5323B0B91C88D97300B183DD /* ViewController.swift */, + 5323B0BB1C88D97300B183DD /* Main.storyboard */, + 5323B0BE1C88D97300B183DD /* Assets.xcassets */, + 5323B0C01C88D97300B183DD /* LaunchScreen.storyboard */, + 5323B0C31C88D97300B183DD /* Info.plist */, + ); + path = Buttons; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 5323B0B31C88D97300B183DD /* Buttons */ = { + isa = PBXNativeTarget; + buildConfigurationList = 5323B0C61C88D97300B183DD /* Build configuration list for PBXNativeTarget "Buttons" */; + buildPhases = ( + 5323B0B01C88D97300B183DD /* Sources */, + 5323B0B11C88D97300B183DD /* Frameworks */, + 5323B0B21C88D97300B183DD /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Buttons; + productName = Buttons; + productReference = 5323B0B41C88D97300B183DD /* Buttons.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 5323B0AC1C88D97300B183DD /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 0720; + ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 5323B0B31C88D97300B183DD = { + CreatedOnToolsVersion = 7.2.1; + }; + }; + }; + buildConfigurationList = 5323B0AF1C88D97300B183DD /* Build configuration list for PBXProject "Buttons" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 5323B0AB1C88D97300B183DD; + productRefGroup = 5323B0B51C88D97300B183DD /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 5323B0B31C88D97300B183DD /* Buttons */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 5323B0B21C88D97300B183DD /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5323B0C21C88D97300B183DD /* LaunchScreen.storyboard in Resources */, + 5323B0BF1C88D97300B183DD /* Assets.xcassets in Resources */, + 5323B0BD1C88D97300B183DD /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 5323B0B01C88D97300B183DD /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 5323B0BA1C88D97300B183DD /* ViewController.swift in Sources */, + 5323B0B81C88D97300B183DD /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 5323B0BB1C88D97300B183DD /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5323B0BC1C88D97300B183DD /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 5323B0C01C88D97300B183DD /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 5323B0C11C88D97300B183DD /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 5323B0C41C88D97300B183DD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 5323B0C51C88D97300B183DD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 9.2; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 5323B0C71C88D97300B183DD /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Buttons/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Buttons; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 5323B0C81C88D97300B183DD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + INFOPLIST_FILE = Buttons/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Buttons; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 5323B0AF1C88D97300B183DD /* Build configuration list for PBXProject "Buttons" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5323B0C41C88D97300B183DD /* Debug */, + 5323B0C51C88D97300B183DD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 5323B0C61C88D97300B183DD /* Build configuration list for PBXNativeTarget "Buttons" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 5323B0C71C88D97300B183DD /* Debug */, + 5323B0C81C88D97300B183DD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 5323B0AC1C88D97300B183DD /* Project object */; +} diff --git a/Buttons/Buttons/AppDelegate.swift b/Buttons/Buttons/AppDelegate.swift new file mode 100644 index 0000000..8bee4c3 --- /dev/null +++ b/Buttons/Buttons/AppDelegate.swift @@ -0,0 +1,41 @@ +// +// AppDelegate.swift +// Buttons +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2016 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? +} + diff --git a/Buttons/Buttons/Assets.xcassets/AppIcon.appiconset/Contents.json b/Buttons/Buttons/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..eeea76c --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,73 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/Contents.json b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/Contents.json b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/Contents.json new file mode 100644 index 0000000..70fd5a2 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "border.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/border.pdf b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedBorder.imageset/border.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0b798decfeace0654604e327922b1ae9b1d0c7a3 GIT binary patch literal 4065 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 literal 0 HcmV?d00001 diff --git a/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/Contents.json b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/Contents.json new file mode 100644 index 0000000..3168b55 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "filled.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/filled.pdf b/Buttons/Buttons/Assets.xcassets/Button Images - No Slicing/unslicedFill.imageset/filled.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bec308024007717309b0677d016f60129eb61f7c GIT binary patch literal 4099 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 literal 0 HcmV?d00001 diff --git a/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/Contents.json b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/Contents.json b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/Contents.json new file mode 100644 index 0000000..132fee5 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/Contents.json @@ -0,0 +1,29 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "border.pdf", + "resizing" : { + "mode" : "9-part", + "center" : { + "mode" : "stretch", + "width" : 1, + "height" : 1 + }, + "cap-insets" : { + "bottom" : 10, + "top" : 10, + "right" : 10, + "left" : 10 + } + } + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/border.pdf b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedBorderTemplate.imageset/border.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0b798decfeace0654604e327922b1ae9b1d0c7a3 GIT binary patch literal 4065 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 literal 0 HcmV?d00001 diff --git a/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/Contents.json b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/Contents.json new file mode 100644 index 0000000..b2cf9b2 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/Contents.json @@ -0,0 +1,29 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "filled.pdf", + "resizing" : { + "mode" : "9-part", + "center" : { + "mode" : "stretch", + "width" : 1, + "height" : 1 + }, + "cap-insets" : { + "bottom" : 10, + "top" : 10, + "right" : 10, + "left" : 10 + } + } + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/filled.pdf b/Buttons/Buttons/Assets.xcassets/Button Templates - Sliced/slicedFillTemplate.imageset/filled.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bec308024007717309b0677d016f60129eb61f7c GIT binary patch literal 4099 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 literal 0 HcmV?d00001 diff --git a/Buttons/Buttons/Assets.xcassets/Contents.json b/Buttons/Buttons/Assets.xcassets/Contents.json new file mode 100644 index 0000000..da4a164 --- /dev/null +++ b/Buttons/Buttons/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Buttons/Buttons/Base.lproj/LaunchScreen.storyboard b/Buttons/Buttons/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..90d6157 --- /dev/null +++ b/Buttons/Buttons/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Buttons/Buttons/Base.lproj/Main.storyboard b/Buttons/Buttons/Base.lproj/Main.storyboard new file mode 100644 index 0000000..15ac78d --- /dev/null +++ b/Buttons/Buttons/Base.lproj/Main.storyboard @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Buttons/Buttons/Info.plist b/Buttons/Buttons/Info.plist new file mode 100644 index 0000000..40c6215 --- /dev/null +++ b/Buttons/Buttons/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Buttons/Buttons/ViewController.swift b/Buttons/Buttons/ViewController.swift new file mode 100644 index 0000000..c3b7cc9 --- /dev/null +++ b/Buttons/Buttons/ViewController.swift @@ -0,0 +1,68 @@ +// +// ViewController.swift +// Buttons +// +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2016 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class ViewController: UIViewController { + + @IBOutlet weak var stackView: UIStackView! + + override func viewDidLoad() { + super.viewDidLoad() + + // Create a custom button and set title label style + + let orangeButton = UIButton(type: .Custom) + orangeButton.setTitle("Orange", forState: .Normal) + orangeButton.setTitleColor(.orangeColor(), forState: .Normal) + orangeButton.setTitleColor(.whiteColor(), forState: .Highlighted) + orangeButton.titleLabel?.font = UIFont.systemFontOfSize(14) + orangeButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 8, 8) + + // Get the pre-sliced template images direct from the + // asset catalog for the default and hightlighted states + + let slicedBorderTemplate = UIImage(named: "slicedBorderTemplate") + let slicedFillTemplate = UIImage(named: "slicedFillTemplate") + + orangeButton.setBackgroundImage(slicedBorderTemplate, forState: .Normal) + orangeButton.setBackgroundImage(slicedFillTemplate, forState: .Highlighted) + + // The tintColor controls the colour used by the template images + // Defaults to inherited value + + orangeButton.tintColor = .orangeColor() + + stackView.addArrangedSubview(orangeButton) + } +} \ No newline at end of file From f5e2ca073399c0f04eba8525b9920b6802229c2d Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 12 Mar 2016 21:44:15 +0000 Subject: [PATCH 032/194] Add scrolling stack view --- Stacks/README | 29 ---- Stacks/README.md | 47 ++++++ Stacks/Stacks.xcodeproj/project.pbxproj | 12 +- .../AppIcon.appiconset/Contents.json | 6 + .../AppIcon.appiconset/icon-167.png | Bin 0 -> 11276 bytes Stacks/Stacks/Base.lproj/Main.storyboard | 153 +++++++++++++++--- Stacks/Stacks/Info.plist | 4 +- .../Stacks/ScrollingStackViewController.swift | 45 ++++++ 8 files changed, 236 insertions(+), 60 deletions(-) delete mode 100644 Stacks/README create mode 100644 Stacks/README.md create mode 100644 Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-167.png create mode 100644 Stacks/Stacks/ScrollingStackViewController.swift diff --git a/Stacks/README b/Stacks/README deleted file mode 100644 index d4bb551..0000000 --- a/Stacks/README +++ /dev/null @@ -1,29 +0,0 @@ -======================================================================= -Stacks - Using stack views (requires iOS 9) - -Version 1.3 05 Oct 2015 Add static quick actions -Version 1.2 27 Sep 2015 Hide a view for compact height -Version 1.1 06 July 2015 Adapting axis to view size classes -Version 1.0 22 June 2015 Initial version. -======================================================================= - -Example of how to use UIStackView to simplify layout of horizontal and -vertical arrangements of views. See the following post for details: - -http://useyourloaf.com/blog/easier-autolayout-with-stackviews.html - -Also see this post for details on how to have the stack view automatically -adapt to size class changes: - -http://useyourloaf.com/blog/adapting-stack-views-with-size-classes.html - -The third view controller - HiddenViewController is an example of how to -use size classes to hide a view contained in a stack view. See this post -for details: - -http://useyourloaf.com/blog/using-size-classes-to-hide-stack-view-contents.html - -Quick actions allow the user to launch the app directly to one of the three tabs. -See this post for details: - -http://useyourloaf.com/blog/adding-3d-touch-quick-actions.html \ No newline at end of file diff --git a/Stacks/README.md b/Stacks/README.md new file mode 100644 index 0000000..1386fb1 --- /dev/null +++ b/Stacks/README.md @@ -0,0 +1,47 @@ +### Stacks + +Examples of using and sometime abusing stack views (requires iOS 9) + +#### Basic Stack View Usage + +Example of how to use UIStackView to simplify layout of horizontal and +vertical arrangements of views. See the following post for details: + ++ [Easier Auto Layout with Stack Views](http://useyourloaf.com/blog/easier-autolayout-with-stackviews/) + +#### Using Stack Views with Size Classes + +Also see this post for details on how to have the stack view automatically +adapt to size class changes: + ++ [Adapting Stack Views with Size Classes](http://useyourloaf.com/blog/adapting-stack-views-with-size-classes/) + +#### Hiding Views in a Stack View + +The third view controller - HiddenViewController is an example of how to +use size classes to hide a view contained in a stack view. See this post +for details: + ++ [Using Size Classes to Hide Stack View Contents](http://useyourloaf.com/blog/using-size-classes-to-hide-stack-view-contents/) + +#### 3D Touch Quick Actions + +Quick actions allow the user to launch the app directly to one of the three tabs. +See this post for details: + ++ [Adding 3D Touch Quick Actions](http://useyourloaf.com/blog/adding-3d-touch-quick-actions/) + +#### Scrolling Stack View + +The ScrollingStackViewController provides an example of how to embed a +stack view in a scroll view. See this post for details: + ++ [Scroll Stack Views](http://useyourloaf.com/blog/scrolling-stack-views/) + +#### Version History + ++ Version 1.4 12 Mar 2016 Add a scrolling stack view ++ Version 1.3 05 Oct 2015 Add static quick actions ++ Version 1.2 27 Sep 2015 Hide a view for compact height ++ Version 1.1 06 July 2015 Adapting axis to view size classes ++ Version 1.0 22 June 2015 Initial version. diff --git a/Stacks/Stacks.xcodeproj/project.pbxproj b/Stacks/Stacks.xcodeproj/project.pbxproj index 2f707eb..fadae18 100644 --- a/Stacks/Stacks.xcodeproj/project.pbxproj +++ b/Stacks/Stacks.xcodeproj/project.pbxproj @@ -8,8 +8,8 @@ /* Begin PBXBuildFile section */ 5378799F1B49BA6A004CBDC1 /* SizeClassViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */; }; - 5395B1371BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; settings = {ASSET_TAGS = (); }; }; - 5395B1381BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 5395B1371BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; }; + 5395B1381BB48B4700CF54F7 /* HiddenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */; }; 53B55B951BC1B89A0071291E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B55B981BC1B89A0071291E /* InfoPlist.strings */; }; 53B55B961BC1B89A0071291E /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 53B55B981BC1B89A0071291E /* InfoPlist.strings */; }; 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */; }; @@ -19,6 +19,7 @@ 53DA13F81B32184600FEEE79 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53DA13F61B32184600FEEE79 /* LaunchScreen.storyboard */; }; 53DA14031B32184600FEEE79 /* StacksTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA14021B32184600FEEE79 /* StacksTests.swift */; }; 53DA140E1B32184600FEEE79 /* StacksUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53DA140D1B32184600FEEE79 /* StacksUITests.swift */; }; + 53E9DC1B1C90E0FB00C9A89C /* ScrollingStackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53E9DC1A1C90E0FB00C9A89C /* ScrollingStackViewController.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -42,6 +43,7 @@ 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SizeClassViewController.swift; sourceTree = ""; }; 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HiddenViewController.swift; sourceTree = ""; }; 53B55B971BC1B89A0071291E /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; }; + 53BB4E981C94C22D0019483F /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 53DA13EA1B32184600FEEE79 /* Stacks.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Stacks.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 53DA13EF1B32184600FEEE79 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; @@ -55,7 +57,7 @@ 53DA14091B32184600FEEE79 /* StacksUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = StacksUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 53DA140D1B32184600FEEE79 /* StacksUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StacksUITests.swift; sourceTree = ""; }; 53DA140F1B32184600FEEE79 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 53F4745D1B38B6C100560817 /* README */ = {isa = PBXFileReference; lastKnownFileType = text; path = README; sourceTree = ""; }; + 53E9DC1A1C90E0FB00C9A89C /* ScrollingStackViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollingStackViewController.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -86,7 +88,7 @@ 53DA13E11B32184500FEEE79 = { isa = PBXGroup; children = ( - 53F4745D1B38B6C100560817 /* README */, + 53BB4E981C94C22D0019483F /* README.md */, 53DA13EC1B32184600FEEE79 /* Stacks */, 53DA14011B32184600FEEE79 /* StacksTests */, 53DA140C1B32184600FEEE79 /* StacksUITests */, @@ -110,6 +112,7 @@ 53DA13ED1B32184600FEEE79 /* AppDelegate.swift */, 53DA13EF1B32184600FEEE79 /* ViewController.swift */, 53DA13F11B32184600FEEE79 /* Main.storyboard */, + 53E9DC1A1C90E0FB00C9A89C /* ScrollingStackViewController.swift */, 5378799E1B49BA6A004CBDC1 /* SizeClassViewController.swift */, 5395B1361BB48B4700CF54F7 /* HiddenViewController.swift */, 53DA13F41B32184600FEEE79 /* Assets.xcassets */, @@ -271,6 +274,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 53E9DC1B1C90E0FB00C9A89C /* ScrollingStackViewController.swift in Sources */, 5395B1371BB48B4700CF54F7 /* HiddenViewController.swift in Sources */, 53DA13F01B32184600FEEE79 /* ViewController.swift in Sources */, 53DA13EE1B32184600FEEE79 /* AppDelegate.swift in Sources */, diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json index 056c0aa..adeb159 100644 --- a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -71,6 +71,12 @@ "idiom" : "ipad", "filename" : "icon-76@2x.png", "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "icon-167.png", + "scale" : "2x" } ], "info" : { diff --git a/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-167.png b/Stacks/Stacks/Assets.xcassets/AppIcon.appiconset/icon-167.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5ec66a8746d77c19afa4db06b0e9e27145e92d GIT binary patch literal 11276 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 - + - + - + @@ -22,28 +22,23 @@ - - - - - - + @@ -72,47 +67,39 @@ - - - - - - - - + @@ -122,6 +109,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -139,7 +245,6 @@ - @@ -152,7 +257,6 @@ - @@ -164,11 +268,9 @@ - - @@ -177,14 +279,14 @@ - + - + @@ -194,13 +296,13 @@ - + @@ -209,6 +311,7 @@ + diff --git a/Stacks/Stacks/Info.plist b/Stacks/Stacks/Info.plist index 52811b9..1f7589c 100644 --- a/Stacks/Stacks/Info.plist +++ b/Stacks/Stacks/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.3 + 1.4 CFBundleSignature ???? CFBundleVersion - 3 + 4 LSRequiresIPhoneOS UIApplicationShortcutItems diff --git a/Stacks/Stacks/ScrollingStackViewController.swift b/Stacks/Stacks/ScrollingStackViewController.swift new file mode 100644 index 0000000..f8c5fcd --- /dev/null +++ b/Stacks/Stacks/ScrollingStackViewController.swift @@ -0,0 +1,45 @@ +// +// ScrollingStackViewController.swift +// Stacks +// +// Created by Keith Harrison on 09/03/2016. +// Copyright © 2016 Keith Harrison. All rights reserved. +// + +import UIKit + +class ScrollingStackViewController: UIViewController { + + @IBOutlet weak var scrollView: UIScrollView! + @IBOutlet weak var stackView: UIStackView! + + @IBAction func singleTap(sender: UITapGestureRecognizer) { + let heartImage = UIImage(named: "Heart") + let heartImageView = UIImageView(image: heartImage) + self.stackView.addArrangedSubview(heartImageView) + self.scrollToEnd(heartImageView) + } + + @IBAction func twoFingerTap(sender: UITapGestureRecognizer) { + let starImage = UIImage(named: "Star") + let starImageView = UIImageView(image: starImage) + self.stackView.addArrangedSubview(starImageView) + self.scrollToEnd(starImageView) + } + + @IBAction func threeFingerTap(sender: UITapGestureRecognizer) { + let views = stackView.arrangedSubviews + for entry in views { + stackView.removeArrangedSubview(entry) + entry.removeFromSuperview() + } + } + + private func scrollToEnd(addedView: UIView) { + let contentViewHeight = scrollView.contentSize.height + addedView.bounds.height + stackView.spacing + let offsetY = contentViewHeight - scrollView.bounds.height + if (offsetY > 0) { + scrollView.setContentOffset(CGPoint(x: scrollView.contentOffset.x, y: offsetY), animated: true) + } + } +} From 4d3691707660c6f3d1ce8354d9d6b52c95d1a5cc Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 12 Mar 2016 22:25:54 +0000 Subject: [PATCH 033/194] Removed surplus self --- Stacks/Stacks/ScrollingStackViewController.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Stacks/Stacks/ScrollingStackViewController.swift b/Stacks/Stacks/ScrollingStackViewController.swift index f8c5fcd..a460be1 100644 --- a/Stacks/Stacks/ScrollingStackViewController.swift +++ b/Stacks/Stacks/ScrollingStackViewController.swift @@ -16,15 +16,15 @@ class ScrollingStackViewController: UIViewController { @IBAction func singleTap(sender: UITapGestureRecognizer) { let heartImage = UIImage(named: "Heart") let heartImageView = UIImageView(image: heartImage) - self.stackView.addArrangedSubview(heartImageView) - self.scrollToEnd(heartImageView) + stackView.addArrangedSubview(heartImageView) + scrollToEnd(heartImageView) } @IBAction func twoFingerTap(sender: UITapGestureRecognizer) { let starImage = UIImage(named: "Star") let starImageView = UIImageView(image: starImage) - self.stackView.addArrangedSubview(starImageView) - self.scrollToEnd(starImageView) + stackView.addArrangedSubview(starImageView) + scrollToEnd(starImageView) } @IBAction func threeFingerTap(sender: UITapGestureRecognizer) { From 56d8a1d503965b7629b6c105ec13328b324616a7 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sat, 12 Mar 2016 22:27:38 +0000 Subject: [PATCH 034/194] Update copyright --- .../Stacks/ScrollingStackViewController.swift | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/Stacks/Stacks/ScrollingStackViewController.swift b/Stacks/Stacks/ScrollingStackViewController.swift index a460be1..554b609 100644 --- a/Stacks/Stacks/ScrollingStackViewController.swift +++ b/Stacks/Stacks/ScrollingStackViewController.swift @@ -2,9 +2,34 @@ // ScrollingStackViewController.swift // Stacks // -// Created by Keith Harrison on 09/03/2016. -// Copyright © 2016 Keith Harrison. All rights reserved. +// Created by Keith Harrison http://useyourloaf.com +// Copyright (c) 2016 Keith Harrison. All rights reserved. // +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. import UIKit From 3433bf705747394fe7ea036fcf9cad74732f4fa0 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Sun, 13 Mar 2016 20:49:06 +0000 Subject: [PATCH 035/194] Use a content stack view --- Stacks/Stacks/Base.lproj/Main.storyboard | 135 ++++++++++++----------- 1 file changed, 69 insertions(+), 66 deletions(-) diff --git a/Stacks/Stacks/Base.lproj/Main.storyboard b/Stacks/Stacks/Base.lproj/Main.storyboard index 969631f..d119908 100644 --- a/Stacks/Stacks/Base.lproj/Main.storyboard +++ b/Stacks/Stacks/Base.lproj/Main.storyboard @@ -121,81 +121,84 @@ - - - - - - - - - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - + - - - - - - + + + + From 38dc9208231920d8a1f6b436b788a83563a60976 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 25 Mar 2016 11:29:54 +0000 Subject: [PATCH 036/194] Adopt Swift 2.2 selector syntax --- AutoLayout/AutoLayout/LayoutGuideController.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/AutoLayout/AutoLayout/LayoutGuideController.swift b/AutoLayout/AutoLayout/LayoutGuideController.swift index 28ce349..caaee87 100644 --- a/AutoLayout/AutoLayout/LayoutGuideController.swift +++ b/AutoLayout/AutoLayout/LayoutGuideController.swift @@ -66,14 +66,16 @@ class LayoutGuideController: UIViewController { let redImage = UIImage(named: "redButton") noButton.setBackgroundImage(redImage, forState: .Normal) noButton.contentEdgeInsets = UIEdgeInsetsMake(8, 16, 8, 16) - noButton.addTarget(self, action: "noThanks:", forControlEvents: .TouchUpInside) + let noThanksAction = #selector(LayoutGuideController.noThanks(_:)) + noButton.addTarget(self, action: noThanksAction, forControlEvents: .TouchUpInside) yesButton.translatesAutoresizingMaskIntoConstraints = false yesButton.setTitle("Yes please!", forState: .Normal) let greenImage = UIImage(named: "greenButton") yesButton.setBackgroundImage(greenImage, forState: .Normal) yesButton.contentEdgeInsets = UIEdgeInsetsMake(8, 16, 8, 16) - yesButton.addTarget(self, action: "yesPlease:", forControlEvents: .TouchUpInside) + let yesPleaseAction = #selector(LayoutGuideController.yesPlease(_:)) + yesButton.addTarget(self, action: yesPleaseAction, forControlEvents: .TouchUpInside) view.addSubview(noButton) view.addSubview(yesButton) From 14d4ad26732034cecd565861652159125309fe42 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 25 Mar 2016 11:52:12 +0000 Subject: [PATCH 037/194] Updated by Xcode 7.3 --- AutoLayout/AutoLayout/Base.lproj/Main.storyboard | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard index c689bb2..88f4933 100644 --- a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard +++ b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard @@ -1,8 +1,8 @@ - + - + From 94fa50dc8bb59c0ec1b497d1cf95ef205571e4d4 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 25 Mar 2016 13:47:37 +0000 Subject: [PATCH 038/194] Layout Guides --- AutoLayout/AutoLayout/Base.lproj/Main.storyboard | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard index 88f4933..f7a2421 100644 --- a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard +++ b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard @@ -136,7 +136,7 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -178,7 +221,7 @@ - + @@ -226,7 +269,7 @@ - + @@ -245,7 +288,7 @@ - + @@ -264,7 +307,7 @@ - + @@ -280,7 +323,7 @@ - + @@ -299,7 +342,7 @@ - + @@ -315,7 +358,7 @@ - + @@ -333,7 +376,7 @@ - + @@ -352,7 +395,7 @@ - + @@ -370,11 +413,141 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AutoLayout/AutoLayout/Info.plist b/AutoLayout/AutoLayout/Info.plist index fd1ab7c..3c0e24f 100644 --- a/AutoLayout/AutoLayout/Info.plist +++ b/AutoLayout/AutoLayout/Info.plist @@ -15,11 +15,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + 1.4 CFBundleSignature ???? CFBundleVersion - 1 + 4 LSRequiresIPhoneOS UILaunchStoryboardName diff --git a/AutoLayout/README.md b/AutoLayout/README.md index 453c261..af9336a 100644 --- a/AutoLayout/README.md +++ b/AutoLayout/README.md @@ -7,15 +7,19 @@ Auto Layout examples using Interface Builder and in code. + Proportional spacing using a stack view + Layout Anchors + Layout Guides as spacer views ++ Adaptive constraints using Interface Builder and code See the following posts further details: + [Proportional Spacing with Auto Layout](http://useyourloaf.com/blog/proportional-spacing-with-auto-layout/) + [Adapting Images for Size Classes](http://useyourloaf.com/blog/adapting-images-for-size-classes/) + [Pain Free Constraints with Layout Anchors](http://useyourloaf.com/blog/pain-free-constraints-with-layout-anchors/) ++ [Goodbye Spacer Views Hello Layout Guides](http://useyourloaf.com/blog/goodbye-spacer-views-hello-layout-guides/) ++ [Adapting AutoLayout Without Interface Builder](http://useyourloaf.com/blog/adapting-auto-layout-without-interface-builder/) #### Version History ++ Version 1.4 28 Mar 2016 Adapting constraints to size classes + Version 1.3 27 Feb 2016 Using layout guides to space views + Version 1.2 22 Feb 2016 Example of using layout anchors + Version 1.1 31 Jan 2016 Custom Asset catalog for size classes. From 4d65e6ffe0163328cedbc85915591b57e51b523e Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 4 Apr 2016 21:51:25 +0100 Subject: [PATCH 040/194] Add contentMode playground --- .../Bottom.xcplaygroundpage/Contents.swift | 15 +++++++++ .../timeline.xctimeline | 11 +++++++ .../Contents.swift | 14 ++++++++ .../timeline.xctimeline | 11 +++++++ .../Contents.swift | 14 ++++++++ .../timeline.xctimeline | 11 +++++++ .../Center.xcplaygroundpage/Contents.swift | 15 +++++++++ .../timeline.xctimeline | 21 ++++++++++++ .../Left.xcplaygroundpage/Contents.swift | 14 ++++++++ .../Left.xcplaygroundpage/timeline.xctimeline | 11 +++++++ .../Redraw.xcplaygroundpage/Contents.swift | 18 +++++++++++ .../timeline.xctimeline | 21 ++++++++++++ .../Right.xcplaygroundpage/Contents.swift | 14 ++++++++ .../timeline.xctimeline | 11 +++++++ .../Contents.swift | 30 ++++++++++++++++++ .../timeline.xctimeline | 16 ++++++++++ .../Contents.swift | 14 ++++++++ .../timeline.xctimeline | 11 +++++++ .../Contents.swift | 17 ++++++++++ .../timeline.xctimeline | 11 +++++++ .../Pages/Top.xcplaygroundpage/Contents.swift | 15 +++++++++ .../Top.xcplaygroundpage/timeline.xctimeline | 11 +++++++ .../TopLeft.xcplaygroundpage/Contents.swift | 14 ++++++++ .../timeline.xctimeline | 11 +++++++ .../TopRight.xcplaygroundpage/Contents.swift | 14 ++++++++ .../timeline.xctimeline | 11 +++++++ .../Contents.swift | 29 +++++++++++++++++ .../Resources/star100.png | Bin 0 -> 1306 bytes .../Sources/CircleView.swift | 22 +++++++++++++ .../Sources/StarView.swift | 21 ++++++++++++ .../contents.xcplayground | 19 +++++++++++ .../contents.xcworkspacedata | 7 ++++ 32 files changed, 474 insertions(+) create mode 100644 Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/timeline.xctimeline create mode 100644 Playgrounds/ContentMode.playground/Pages/contentMode.xcplaygroundpage/Contents.swift create mode 100644 Playgrounds/ContentMode.playground/Resources/star100.png create mode 100644 Playgrounds/ContentMode.playground/Sources/CircleView.swift create mode 100644 Playgrounds/ContentMode.playground/Sources/StarView.swift create mode 100644 Playgrounds/ContentMode.playground/contents.xcplayground create mode 100644 Playgrounds/ContentMode.playground/playground.xcworkspace/contents.xcworkspacedata diff --git a/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..24abc4e --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/Contents.swift @@ -0,0 +1,15 @@ +import UIKit +import XCPlayground +/*: + ### Bottom + + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .Bottom +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..f4e4340 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Bottom.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..1bb2c89 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Bottom Left + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .BottomLeft +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..750a3a3 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/BottomLeft.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..f3442e5 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Bottom Right + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .BottomRight +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..e2347be --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/BottomRight.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..a7cbc6e --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/Contents.swift @@ -0,0 +1,15 @@ +import UIKit +import XCPlayground +/*: + ### Center + + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .Center +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..5e04c90 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Center.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,21 @@ + + + + + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..4844811 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Left + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .Left +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..da653f9 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Left.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..8486cfd --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/Contents.swift @@ -0,0 +1,18 @@ +import UIKit +import XCPlayground +/*: + ### Redraw + + Use this mode when you have a custom view that implements drawRect. + + When the bounds of the view change the view will be redrawn by + calling drawRect. + */ +let myView = CircleView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.backgroundColor = .whiteColor() +myView.contentMode = .Redraw +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) \ No newline at end of file diff --git a/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..c8b56ae --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Redraw.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,21 @@ + + + + + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..e87045f --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Right + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .Right +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..52f2979 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Right.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..8788d5e --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/Contents.swift @@ -0,0 +1,30 @@ +import UIKit +import XCPlayground +/*: + ### Scale Aspect Fill + `ScaleAspectFill` scales the content to totally fill the view maintaining the aspect ratio. This can result in the content being larger than the bounds of the view. + + */ +let containerView = UIView(frame: CGRect(x: 0, y: 0, width: 400, height: 400)) +containerView.backgroundColor = .redColor() + +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +containerView.addSubview(myView) +myView.center = CGPoint(x: 200, y: 200) + +myView.starImageView.contentMode = .ScaleAspectFill +/*: + #### clipToBounds + You will most likely want to have the superview set to clip subviews + to bounds to prevent the scaled view from being visible outside the + super view. + + Try changing the following setting to see the difference. + */ +myView.clipsToBounds = true + +containerView +XCPlaygroundPage.currentPage.liveView = containerView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..ec83354 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFill.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..daae1d1 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Scale Aspect Fit + + `ScaleAspectFit` scales the content to fit the view but maintains the aspect ratio. Any part of the view bounds that is not filled with content is transparent. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .ScaleAspectFit +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..61b3e15 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/ScaleAspectFit.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..5e6608e --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/Contents.swift @@ -0,0 +1,17 @@ +import UIKit +import XCPlayground +/*: + ### Scale To Fill + + This is the default mode. + + The image is stretched in both dimensions to fill the frame. The + aspect ratio of the image is not maintained. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .ScaleToFill +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..07c1389 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/ScaleToFill.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..e96706e --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/Contents.swift @@ -0,0 +1,15 @@ +import UIKit +import XCPlayground +/*: + ### Top + + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .Top +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..0e86698 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/Top.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..5fdbfd4 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Top Left + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .TopLeft +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..bfa3c3c --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/TopLeft.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..330506c --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/Contents.swift @@ -0,0 +1,14 @@ +import UIKit +import XCPlayground +/*: + ### Top Right + Fix the position of the content. Does not scale + or stretch the content. + */ +let myView = StarView(frame: CGRect(x: 0, y: 0, width:200, height:350)) +myView.starImageView.contentMode = .TopRight +myView +XCPlaygroundPage.currentPage.liveView = myView +//: [Previous](@previous) +//: [Index](contentMode) +//: [Next](@next) diff --git a/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/timeline.xctimeline b/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/timeline.xctimeline new file mode 100644 index 0000000..5490561 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/TopRight.xcplaygroundpage/timeline.xctimeline @@ -0,0 +1,11 @@ + + + + + + + diff --git a/Playgrounds/ContentMode.playground/Pages/contentMode.xcplaygroundpage/Contents.swift b/Playgrounds/ContentMode.playground/Pages/contentMode.xcplaygroundpage/Contents.swift new file mode 100644 index 0000000..04412dc --- /dev/null +++ b/Playgrounds/ContentMode.playground/Pages/contentMode.xcplaygroundpage/Contents.swift @@ -0,0 +1,29 @@ +/*: + ### UIView contentMode Quick Guide + +The `contentMode` property of UIView allows you to control how to layout a view when the view's bounds change. The system will not, by default, redraw a view each time the bounds change. That would be wasteful. Instead, depending on the content mode, it can scale, stretch or pin the contents to a fixed position. + + There are thirteen different content modes but it is easiest to think of three main groups based on the effect: + + #### Scaling the View (with or without maintaining the aspect ratio) + ++ [Scale To Fill](ScaleToFill) ++ [Scale Aspect Fit](ScaleAspectFit) ++ [Scale Aspect Fill](ScaleAspectFill) + + #### Redrawing the View + ++ [Redraw](Redraw) + + #### Positioning the View + ++ [Center](Center) ++ [Top](Top) ++ [Bottom](Bottom) ++ [Left](Left) ++ [Right](Right) ++ [TopLeft](TopLeft) ++ [TopRight](TopRight) ++ [BottomLeft](BottomLeft) ++ [BottomRight](BottomRight) +*/ diff --git a/Playgrounds/ContentMode.playground/Resources/star100.png b/Playgrounds/ContentMode.playground/Resources/star100.png new file mode 100644 index 0000000000000000000000000000000000000000..4965255dc5c56ab3d62c08ab371db50421bcb727 GIT binary patch literal 1306 zcmV+#1?BpQP)LRY? zN?hBWG1ke`=_CWu_^ahjSlgj4*UZrACj!y=r{qyp+oUYk&-U#B&FCrt(fXz2R8rcf zDb~{U?gGl`Eu!OBPTH#`)z!%8FP`IDOxms_)z|dx1I6evo8w+d+OZ+k+VkxM!{;@a z;$TJDwI9{n^6dq`=Q)((WJ1`u9n{_N?FPK(JQdUBrsPv<-H$ES%?r}-5!2~4*Tq@f zpnl(b>FW;O>KeM|K9%BQao&hc*{mwo(FoD=4$|#;-+-OtT*BuzD=U;$OYyJL2mWvE@gN;cIH$kh$hR-Rc|B=_ak^ONiibW!;qt z((<(CL~GrSujNUq+B3Y*u6N{ z!gt<+=j#yU>=Q88%H!)5E!NK9>lj+xpCZ-SRNJN3>L4D~+)vu78`R$?)zpmPY`5k? zj^Sz()aO6gyW{H=Y21+()8v!kWkJ}vzUDfX;$p$)H%8gCaNdbX*|NpxGjiUCMA^2? z=qpUxtqjudc;12N>kr51FxKiJh2V7V>?_vL@a+dS*TkgbRYTaf#OE~5=qXd$rl{mlR@w@5Sq2yTn&#c)100N## zL_t(|0qxj>dNeoy1<+gF+P3-Iwr$(0ZQEJnm3-mirOOnTeZ~Lkwd*(hAmHY~Tet7ry+>7R!|y+MxOHO;9LPU?>d|BB zvHi)@XU|{2){B?a>J{ucS4e$QyqMims^M1tB$5S6c@`$EfOfJ%lw-O=B1&oTiGVW=J_ec`dDw z^gNZ4+Oi<6IGa))-++SlwUpr70VSQAD6Fd+ih8zFP;@VpU7(;osOzU7AE+CkpyyC` zkAeoFY>1*BLD?`xjX>Ebg}nwFcJQ1d<|d;leh)wJW%hp+C@j*C#zL0e z6%DlX88OLO~Yiti7`v4*m8!=llT$e{x3Z{ysR>^9N^a@`Su&oE8#=5%a6fB!?8Uoa%y#ERwS=H})$2?F+@vwNYd Qm;e9(07*qoM6N<$f-6757XSbN literal 0 HcmV?d00001 diff --git a/Playgrounds/ContentMode.playground/Sources/CircleView.swift b/Playgrounds/ContentMode.playground/Sources/CircleView.swift new file mode 100644 index 0000000..9ca1165 --- /dev/null +++ b/Playgrounds/ContentMode.playground/Sources/CircleView.swift @@ -0,0 +1,22 @@ +import UIKit + +public class CircleView: UIView { + + var lineWidth: CGFloat = 5 { + didSet { setNeedsDisplay() } + } + + var color: UIColor = .redColor() { + didSet { setNeedsDisplay() } + } + + public override func drawRect(rect: CGRect) { + + let circleCenter = convertPoint(center, fromView: superview) + let circleRadius = min(bounds.size.width,bounds.size.height)/2 * 0.80 + let circlePath = UIBezierPath(arcCenter: circleCenter, radius: circleRadius, startAngle: 0, endAngle: CGFloat(2*M_PI), clockwise: true) + circlePath.lineWidth = lineWidth + color.set() + circlePath.stroke() + } +} diff --git a/Playgrounds/ContentMode.playground/Sources/StarView.swift b/Playgrounds/ContentMode.playground/Sources/StarView.swift new file mode 100644 index 0000000..d1bc0fe --- /dev/null +++ b/Playgrounds/ContentMode.playground/Sources/StarView.swift @@ -0,0 +1,21 @@ +import UIKit + +public class StarView: UIView { + + public let starImageView: UIImageView + + public override init(frame: CGRect) { + let starImage = UIImage(named: "star100") + starImageView = UIImageView(image: starImage) + + super.init(frame: frame) + addSubview(starImageView) + backgroundColor = .greenColor() + starImageView.frame = bounds + } + + public required init?(coder aDecoder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} + diff --git a/Playgrounds/ContentMode.playground/contents.xcplayground b/Playgrounds/ContentMode.playground/contents.xcplayground new file mode 100644 index 0000000..e759d69 --- /dev/null +++ b/Playgrounds/ContentMode.playground/contents.xcplayground @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Playgrounds/ContentMode.playground/playground.xcworkspace/contents.xcworkspacedata b/Playgrounds/ContentMode.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..5cbf448 --- /dev/null +++ b/Playgrounds/ContentMode.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + From 4b6942f45f69c3fb18ba8408239f92f449b4e595 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 4 Apr 2016 21:58:00 +0100 Subject: [PATCH 041/194] Zip playground files --- Playgrounds/ContentMode.zip | Bin 0 -> 36587 bytes Playgrounds/String.zip | Bin 0 -> 11986 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Playgrounds/ContentMode.zip create mode 100644 Playgrounds/String.zip diff --git a/Playgrounds/ContentMode.zip b/Playgrounds/ContentMode.zip new file mode 100644 index 0000000000000000000000000000000000000000..464fa32bdb5ba5d172567b7e5da8e828571f64de GIT binary patch literal 36587 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 literal 0 HcmV?d00001 diff --git a/Playgrounds/String.zip b/Playgrounds/String.zip new file mode 100644 index 0000000000000000000000000000000000000000..64cb3fcb5cb958a2e6a3d24431bc195f015fc6b2 GIT binary patch literal 11986 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 Date: Mon, 11 Apr 2016 16:53:21 +0100 Subject: [PATCH 042/194] Add example of right-to-left language --- .../AutoLayout.xcodeproj/project.pbxproj | 8 ++ .../AutoLayout/Base.lproj/Main.storyboard | 120 +++++++++++++++--- AutoLayout/AutoLayout/Info.plist | 4 +- AutoLayout/AutoLayout/RTLViewController.swift | 69 ++++++++++ .../AutoLayout/ar.lproj/LaunchScreen.strings | 3 + AutoLayout/AutoLayout/ar.lproj/Main.strings | 78 ++++++++++++ AutoLayout/README.md | 3 + 7 files changed, 266 insertions(+), 19 deletions(-) create mode 100644 AutoLayout/AutoLayout/RTLViewController.swift create mode 100644 AutoLayout/AutoLayout/ar.lproj/LaunchScreen.strings create mode 100644 AutoLayout/AutoLayout/ar.lproj/Main.strings diff --git a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj index e4e68bd..c2d60e9 100644 --- a/AutoLayout/AutoLayout.xcodeproj/project.pbxproj +++ b/AutoLayout/AutoLayout.xcodeproj/project.pbxproj @@ -10,6 +10,7 @@ 5319D0191CA6E8C1009E4AFA /* AdaptiveViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5319D0181CA6E8C1009E4AFA /* AdaptiveViewController.swift */; }; 5329F1161C79008300A35954 /* LayoutAnchorController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5329F1151C79008300A35954 /* LayoutAnchorController.swift */; }; 53358D6F1C80F0B100C1842A /* LayoutGuideController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53358D6E1C80F0B100C1842A /* LayoutGuideController.swift */; }; + 535078741CBAD4D400700816 /* RTLViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 535078731CBAD4D400700816 /* RTLViewController.swift */; }; 5362E7F81C53F1B200DAA88B /* CenterAlignViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5362E7F71C53F1B200DAA88B /* CenterAlignViewController.swift */; }; 53D6A5F11C53BF5200A81A14 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D6A5F01C53BF5200A81A14 /* AppDelegate.swift */; }; 53D6A5F31C53BF5200A81A14 /* MasterViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53D6A5F21C53BF5200A81A14 /* MasterViewController.swift */; }; @@ -26,6 +27,9 @@ 5319D0181CA6E8C1009E4AFA /* AdaptiveViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdaptiveViewController.swift; sourceTree = ""; }; 5329F1151C79008300A35954 /* LayoutAnchorController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutAnchorController.swift; sourceTree = ""; }; 53358D6E1C80F0B100C1842A /* LayoutGuideController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LayoutGuideController.swift; sourceTree = ""; }; + 535078731CBAD4D400700816 /* RTLViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RTLViewController.swift; sourceTree = ""; }; + 535078751CBADA0C00700816 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Main.strings; sourceTree = ""; }; + 535078761CBADA0C00700816 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/LaunchScreen.strings; sourceTree = ""; }; 5362E7F71C53F1B200DAA88B /* CenterAlignViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = CenterAlignViewController.swift; sourceTree = ""; tabWidth = 4; }; 53D6A5ED1C53BF5200A81A14 /* AutoLayout.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AutoLayout.app; sourceTree = BUILT_PRODUCTS_DIR; }; 53D6A5F01C53BF5200A81A14 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -78,6 +82,7 @@ 53D6A5F01C53BF5200A81A14 /* AppDelegate.swift */, 53D6A5F21C53BF5200A81A14 /* MasterViewController.swift */, 5362E7F71C53F1B200DAA88B /* CenterAlignViewController.swift */, + 535078731CBAD4D400700816 /* RTLViewController.swift */, 5329F1151C79008300A35954 /* LayoutAnchorController.swift */, 53358D6E1C80F0B100C1842A /* LayoutGuideController.swift */, 53EDF4071C5D5C78009F91EA /* StackViewController.swift */, @@ -177,6 +182,7 @@ 53358D6F1C80F0B100C1842A /* LayoutGuideController.swift in Sources */, 5319D0191CA6E8C1009E4AFA /* AdaptiveViewController.swift in Sources */, 53EDF4081C5D5C78009F91EA /* StackViewController.swift in Sources */, + 535078741CBAD4D400700816 /* RTLViewController.swift in Sources */, 5329F1161C79008300A35954 /* LayoutAnchorController.swift in Sources */, 53EDF40C1C5D6641009F91EA /* UIViewController+addView.swift in Sources */, 5362E7F81C53F1B200DAA88B /* CenterAlignViewController.swift in Sources */, @@ -191,6 +197,7 @@ isa = PBXVariantGroup; children = ( 53D6A5F71C53BF5200A81A14 /* Base */, + 535078751CBADA0C00700816 /* ar */, ); name = Main.storyboard; sourceTree = ""; @@ -199,6 +206,7 @@ isa = PBXVariantGroup; children = ( 53D6A5FC1C53BF5200A81A14 /* Base */, + 535078761CBADA0C00700816 /* ar */, ); name = LaunchScreen.storyboard; sourceTree = ""; diff --git a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard index 456e2a2..64d65bb 100644 --- a/AutoLayout/AutoLayout/Base.lproj/Main.storyboard +++ b/AutoLayout/AutoLayout/Base.lproj/Main.storyboard @@ -53,7 +53,7 @@ -