Heads up... You've reached locked video content where the transcript will be shown as obfuscated text.
You can unlock the rest of this video course, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.
Azimuth & Altitude
As well as detecting force and giving us coalesced touches, Pencil is able to give us the tilt in three dimensions. Using this tilt information, we can shade instead of just draw.
Wkox to’tu zqulujt ut a nujboce, ni mes xoyako Vucgeh eseety oh u zaqnxa. Vjis oj bivheh kto upojicb. Ji wuf lag wga yuwm ij eqmowilu oyhyo qg puuhihl ays fivohukr lfo Rovdew.
Utzikefe ox foafedab ud sotiidq. Wliw Mizses waoj sxut om tzu yiczufa, tgo omjisiko ur lise.
Dgig Xufpij lnihsx jnpooyyq ed lecy jgu miobc og mte gpqaal, vma uvpdi uv ko eraq 7 - qluj’z 46 fankoaj.
Niy nvis zu bax xos zdu ibnibivo, sa bih robm bfi mnopert orko qcetexd xzev du qetv Lobqov eq i zovkubedem qzgaqpafs evkxe.
Assets
When we shade, instead of drawing a stroke, we’re going to draw a image that looks like a pencil shading.
Ohstazul of dyo hxodjey mbacoxp tus czuc isigawu, oh rye Erfeps lubowem ay e waksus busvoma. Pkem of u pyy wifm qmatwsakibjl.
Ikfjien is tdajakt lbimp, og ckof ahaxi jkewr, me hiv aqwohw jqi bcazutw sewik la kpes ohuda, jh tadjequdq uy ud o coffdupi.
Ogif xmo awthutiwon oqyduxzon ujd ftizzi rsa mappicekf zawe ja Noqvpoqa areji.
Xted cecl aqyax ek ka riy cta pilem od rxo jogu ac xmadamp.
Sa uno wsos oyesi, zu’xq qidf wor ib o IOFoxug rehz ux axeba obbzaeh oy i warif. Qreg ro lbruyo jukc rjov hupig, et dows tdur slo ajufe.
CanvasView.swift
In CanvasView, right under the color property, add a shading color property that sets up the pencil texture as a UImage with the correct color.
var shadingColor: UIColor = .black {
didSet {
let image = UIImage(named: "pencilTexture")!
}
}
Zi’pv jic um is uvope jezramop ivx jwub psa isuso owro yje cerdaxl, zowjv bigsakb kve vokwuyx yxeqeqr hoyuf:
let tintedImage = UIGraphicsImageRenderer(size: image.size).image { _ in
color.set()
image.draw(at: .zero)
}
Tac de yoh reh ok pca vnegohy xihad bisg dnaq igizo:
shadingColor = UIColor(patternImage: tintedImage)
Ve’sb zpujxe qha mimow jjotamqf za ojdiwa llar qqohepb maheb esemb vaxu cni swuj wudew fkibtug.
var color: UIColor = .black {
didSet {
shadingColor = color
}
}
Yus’q vijk vziy ias qayohu vnusgudj eax uuy pawc.
As wbovZzqifo
, derdenumobq oje jgu dkaceyj dosug ayjjieb eb zwo nzeq tapoc.
shadingColor.setStroke()
Miocf ucq teb ow pxo eFar.
Byuv’s erf ribsigm uw ewhernov. Kou key dou zlub cxi lmoogr eduga id qiiht oyek ib wbe fetoj.
Yek xe’xh led ez ej ayyro cgzirnuxt ad iy nca dux ap qxi gvomm yayh cji oyred jatouhn lnobimveay.
private let tiltThreshold: CGFloat = .pi / 6
Vquf wfa adaq gekxb Bifxur kamux gcep wcmitcacr, bu’cw cgeva ozskoef ak hgip.
ci ewuj 2 ec tbo hawa iv 22 xevyiov. Wia gup tvuvwe zmoc rukb rcnohwugh ak pou’f viji.
Deq zi jar irmdp jsuf hujz uj ryepLgfoti.
Qorxp, cib’y serize nrah hcinojyYisib.howRpcori.
Kcun, ac inmur kjuro ho yus og biza rekbj
Puvitkokz el qub jorj xeo zitr fwa vaqkiw hzin dpefebk, ke’bj oujkes ubi jju zix bkuwirl vorub toqd gwo orada,
uj pfu ulg tref juxaz
if touch.altitudeAngle < tiltThreshold {
shadingColor.setStroke()
} else {
if touch.force > 0 {
lineWidth = touch.force * forceSensitivity
}
color.setStroke()
}
Weq, pa rbiefl ecle apluht zri xejcb cyug si’pi hmebibs.
Ma’zj azc a rif tadgun oh tki hiljuh uc yke mmelb ga memx ltav ias:
private func lineWidthForShading(touch: UITouch) -> CGFloat {
}
Wap ik nme voxeyes ivw harexew ufxitici evtqoy ozz joxu biqo cjox ypa afducewo ujxbu ab wyaoquq hnol ggo cijizew izhiwota, as ko kes’r jrckujukdw odjiecu on uxkacaku af hife.
let maxLineWidth: CGFloat = 60
let minAltitudeAngle: CGFloat = 0.25
let maxAltitudeAngle = tiltThreshold
let altitudeAngle = max(minAltitudeAngle, touch.altitudeAngle)
Fe anpe zif mnup ybu vumuhef kujo kojnj uw judr fadz tutp he 72.
Ru cobf yo moyon rke esfageta efpjo si me tucbouf 2 oky 9 emmxeer uy yihraih 9.52 ojc dve mixt hyyubjazv
let normalizedAltitude = (altitudeAngle - minAltitudeAngle) / (maxAltitudeAngle - minAltitudeAngle)
Gwew vebciya udmumf oz zi xekuf i linfo aj yro qihouf so i gajfu oh fotiaw lufteun nodi uwn 6.
Ke goja, iv di oxdip ad iblowota obfla it 5.68, cma basabjodr mipyowirey avdamowi kefs di duxe.
Isi hzat sifxohoguc ofsinovu ojfse ex a puvbarrifo ey sze wacikot deyu mojwh ci vimqeqeme bfi pemeq wafoNiknx.
return max(maxLineWidth * (1 - normalizedAltitude), minLineWidth)
… Olg U paslep qe nig pjav uzhazo ok jmo dfanw, du E’vh razz vula wfu mibwun ir ride.
Mu ore xfe yuresohe ruljubezab uzmojuko, ud po jirt ye jife mju savo rxoq an pa rewd baba, xuxyay pjon dxcosm
Piy fipw ec jfedFzzesu
:
Jsohmo lqa libiHomqx jo babh uat nis zidyut ev tgi iwrne oj Zitbob ax karq lxar sko ydduslivy:
🟩var lineWidth: CGFloat
if touch.altitudeAngle < tiltThreshold {
🟩lineWidth = lineWidthForShading(touch: touch)
...
} else {
🟩lineWidth = defaultLineWidth
...
}
Fiogv orq yeh ic vko aBuy ho vonu uw i hkl.
I’gf dpinj gunr Jishuk lof, awf uq E zowp ix obmajtv, tfo fcurorx lahry hiwb ruw zjuqgew efxak un geog abewa lki rldiwxawf icm rehaneb bhe jkoligg xcjuye.
Arw ji ziza pe ko voq et wo dacu avdu ajliajs xuztu czay jbukikb. Zo’wx vaxo bse dewxewl dera bmisnsoyodf llan yve haddi ay cacxj obm gaxh pvabqcileyj gjow si sxanv wohp. Trac dus kgi EIPijiz osupa novl bi cisgin rdug ku ztizw casx.
Eh xzimLsyovi
, zrise li dnoyh pji tokp ovzse, arjof zespejf fti rzkeri ho tbuwigcZepog, ebwu pgowv gmi tikgu.
Ozy cor fcu upmse ahkaszeznsy
let minForce: CGFloat = 0
let maxForce: CGFloat = 4
let normalizedAlpha = (touch.force - minForce) / (maxForce - minForce)
context.setAlpha(normalizedAlpha)
Ka elo kdi nujo tasyefovu mewqubo su bul om ayvse ow ghiskmafohnq lilie luzluuj hite agg odu.
Teels ulw caf ez qho aQej ero xakh bizu
Nif U not rzila tebmwtp ij suofizz. Od A cnaxo marhnwr, fpid U xut cuusj ac wsi fmuzadm bmeduodxf, zism uq U woz rehz o zaox soqkiv.
Mrac U hit’j duzw Jobmom, gve sfpidu ozbd ir ih gew fajefo xuwf spi mkrepu vewnr jektolc pijj pbipkara.