From 905508e9be10b1ffc964fd18669b4dc73b7151d8 Mon Sep 17 00:00:00 2001 From: Michael Schneider Date: Fri, 26 Aug 2016 11:55:13 -0700 Subject: [PATCH] Factor in constrained size for final size calculation of ASTextNode (#2146) --- AsyncDisplayKit/ASTextNode.mm | 13 +++++++---- .../ASTextNodeSnapshotTests.m | 22 ++++++++++++++++++ ...sIncludedWithSmallerConstrainedSize@2x.png | Bin 0 -> 5998 bytes 3 files changed, 31 insertions(+), 4 deletions(-) create mode 100644 AsyncDisplayKitTests/ReferenceImages_64/ASTextNodeSnapshotTests/testTextContainerInsetIsIncludedWithSmallerConstrainedSize@2x.png diff --git a/AsyncDisplayKit/ASTextNode.mm b/AsyncDisplayKit/ASTextNode.mm index e0be8e330e..bf7ca79005 100644 --- a/AsyncDisplayKit/ASTextNode.mm +++ b/AsyncDisplayKit/ASTextNode.mm @@ -354,6 +354,7 @@ static NSArray *DefaultLinkAttributeNames = @[ NSLinkAttributeName ]; if (layout != nil) { ASDN::MutexLocker l(__instanceLock__); CGSize layoutSize = layout.size; + //Apply textContainerInset layoutSize.width -= (_textContainerInset.left + _textContainerInset.right); layoutSize.height -= (_textContainerInset.top + _textContainerInset.bottom); @@ -367,12 +368,15 @@ static NSArray *DefaultLinkAttributeNames = @[ NSLinkAttributeName ]; - (CGSize)calculateSizeThatFits:(CGSize)constrainedSize { + ASDN::MutexLocker l(__instanceLock__); + ASDisplayNodeAssert(constrainedSize.width >= 0, @"Constrained width for text (%f) is too narrow", constrainedSize.width); ASDisplayNodeAssert(constrainedSize.height >= 0, @"Constrained height for text (%f) is too short", constrainedSize.height); - ASDN::MutexLocker l(__instanceLock__); + // Cache the original constrained size for final size calculateion + CGSize originalConstrainedSize = constrainedSize; - //remove textContainerInset + // Adjust constrainedSize for textContainerInset before assigning it constrainedSize.width -= (_textContainerInset.left + _textContainerInset.right); constrainedSize.height -= (_textContainerInset.top + _textContainerInset.bottom); @@ -395,11 +399,12 @@ static NSArray *DefaultLinkAttributeNames = @[ NSLinkAttributeName ]; } } - //add textContainerInset + // Add the constrained size back textContainerInset size.width += (_textContainerInset.left + _textContainerInset.right); size.height += (_textContainerInset.top + _textContainerInset.bottom); - return size; + return CGSizeMake(std::fmin(size.width, originalConstrainedSize.width), + std::fmin(size.height, originalConstrainedSize.height)); } #pragma mark - Modifying User Text diff --git a/AsyncDisplayKitTests/ASTextNodeSnapshotTests.m b/AsyncDisplayKitTests/ASTextNodeSnapshotTests.m index 5fb5a3f556..b23795cf8a 100644 --- a/AsyncDisplayKitTests/ASTextNodeSnapshotTests.m +++ b/AsyncDisplayKitTests/ASTextNodeSnapshotTests.m @@ -31,6 +31,28 @@ ASSnapshotVerifyNode(textNode, nil); } +- (void)testTextContainerInsetIsIncludedWithSmallerConstrainedSize +{ + UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectZero]; + backgroundView.layer.as_allowsHighlightDrawing = YES; + + ASTextNode *textNode = [[ASTextNode alloc] init]; + textNode.attributedText = [[NSAttributedString alloc] initWithString:@"judar judar judar judar judar judar" + attributes:@{ NSFontAttributeName : [UIFont systemFontOfSize:30] }]; + + [textNode measureWithSizeRange:ASSizeRangeMake(CGSizeZero, CGSizeMake(100, 80))]; + textNode.frame = CGRectMake(50, 50, textNode.calculatedSize.width, textNode.calculatedSize.height); + textNode.textContainerInset = UIEdgeInsetsMake(10, 10, 10, 10); + + [backgroundView addSubview:textNode.view]; + backgroundView.frame = UIEdgeInsetsInsetRect(textNode.bounds, UIEdgeInsetsMake(-50, -50, -50, -50)); + + textNode.highlightRange = NSMakeRange(0, textNode.attributedText.length); + + [ASSnapshotTestCase hackilySynchronouslyRecursivelyRenderNode:textNode]; + FBSnapshotVerifyLayer(backgroundView.layer, nil); +} + - (void)testTextContainerInsetHighlight { UIView *backgroundView = [[UIView alloc] initWithFrame:CGRectZero]; diff --git a/AsyncDisplayKitTests/ReferenceImages_64/ASTextNodeSnapshotTests/testTextContainerInsetIsIncludedWithSmallerConstrainedSize@2x.png b/AsyncDisplayKitTests/ReferenceImages_64/ASTextNodeSnapshotTests/testTextContainerInsetIsIncludedWithSmallerConstrainedSize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d5c6cdfcb30ee28c4b70d0ce974bfc155c35b913 GIT binary patch literal 5998 zcmeHL`9G9v8@E-Qlw~?4X^4f35Pq{oD#x!D|`bUByQNcg$oJoRo!gDXB-cI z2L=`Vpsj}_~{L=&X61SYpvde+~)EVf>i;==}<9201;R-u$IH{ z@DizH&avs#=P8nphHcNtY%hXre}CdgnlesDi3tX7o@jIyRsnoZEO$;i~e9I3ZyXF>z_7e{cQ;;eXErT?>pA zTT3zjxH7Wns<-4?gw}x3h2i)_Aq*JPst;@R_Ll5a6h%JF5|_@BEo(UXtmU1YD`Y!S zH2b&RFo^+bSj*1=hP$4OQm@31gQUq`>52#bk^@x$x1WNfAKdAabB&P{-z_3$C}oMK z$n~0xNs8?d7RihIetoBuC!H&+ASQktyijkj-LTbIwB=;n33VmN*!#P~wT+u{IrkbC z9td~6>N;^l8n7Uat^WSmC|C!Oi<|j^H-n!r2sDreRNNGKU#JC%d`Pte6+dcF(>Q{T5yBwFv4vss+~T1xuJMrgDERjtdvg-v zlD9GtJmWY+5%E$i*7itU20_n_lTx85H;63|>z>a+MZwu1=T zVS#^UZ;1VqMAx4+x9W$+osc*d-csS84SOvZow?vegM1Ht$>4ju_2`0+EY*Hp8(^x5 zh#kiuw6mPGoGeQi0pN&h8|B=(Zt5UpNI={PQ1UqDQ0sE4LTe!VhdJ8;whMK|YW_0Y zRluI`Fb0cD%WXP9D)xk(lW*5S#aQ{b!{x(hIV4^IUlIlq7E#r`=IX#jyC>8C9vHFg ze~PLgMLu~zX(HA8*o%onpDv2%g~;veg3GOBE@>NzOMew}*H)n5jXxP;2YCx^KYrh$ ze!vRej@=6p17RM@j3hSbQAe_S`ysbJhGx)1;o5;a&Uz1uydd`O4T_3ws#Eu6Y(zH> z-sT9uA4O`rzv{k3eK8E48}(Ti{VQpR8P&Lvhfi|C7JJ&Evv?4WC*!XHG|tHh&0M(2 zE^GFA0k2c#L^9?tqN``d2l{ahjxNRAQeHBNDC%(v0jyZDc*%s{s>uc49Kg-4H|+ak z$IRSjhqf_~@xaaVrpfFBHFfF~S~}0d$Q1t)Y}p<*TvUP$D$OD3jV=V?6df-gY+Vi@ z_>3Aj_LJzV81Nx|8Kv_gR@>Wx{lNR$LMKY6OGWD!R}I{1CJqgtMiOU2(ba53d5Bli z%z8E_AC~t>KI}>byU7Z^5?{+mV!Vk&VDb34KO8xHEYIaGKQqdhEmeZLlE)F` zyqO=PVR8PBAte?IO$%npWMatc&WV8(I{e_uLD{Y3PHn3vcNJRf@{0JH{wfb0eUy+l zNN-SQ<87Vedhl$&9wK7Hpe+2gC#|8tUrnd9`y3~47NjreyGW}?2Esbs2qBl@+57%c zX5CEgq8E>J#mAyOPDYQ*;yF>t`<&3!to#~#cH|3Rv)F4BRX9ZVBH3-B!IUb;x7=^Q z+^4qXNmS@sfmet>+r%umU)U1mY01D1yGt&1vtoNjJ%b`Hu*)K((3bdmJ@(~fdYUP< z4i{>s#sAcXX#MjijB$Tdp)Nj!$$wm?XHb`;5#8KOKQLz}{~Nq))~htxp(>xsQ)r*7 zW)KMOHE(hsOZ{A+tW&hMnMxg><`N&P>X`ja9u$K&!L){ZW2EO1;8{fWJzxKZb92uE zeYyPG>g;Mhdj2El{h#hOm{?&UA%Wm;uPplZajU5B*3r(C~5nEcSk zjlCS|0*h_>G-gR@epzZyTN-!5u~Fd+V(se??w32J{FN#XPfNYh37EE92rjmrhs>~u zj(s>U^^NYi2vXQ9BIf9=vx6RE4|a)nGy5`bilMt@+ZP@D}pMH)yg~;_b2Ym8_{yT?Q(s%|s#u$Nm!S9NzRIK*M>#rakbK!`LQ*Zk5%!X1Rec8BK(g(17niohXr#Rx zInKSzGBGFmgBA?b!aA|dV;re7U~EEILBbE0;^>AZ>jJyY3DTE0Cscw2d!~U2?YU#> zDr2DUnrdMXPh6BOtM-{Aew-A&flctTnQF{fghm@pzL6O|9c?(-FEbyOMq1F5g>FH8 z|FCX#@_HtOWg?L7%lD?4r_xuBB3D$gnnw|51uV_B(VEBBQ(dg4=5zvsdtlpEU|)03 zUs~l|B&#&*8CDmVUEtDW5bw2^C`;KjKLo9?GANMW71m4`7|(#@AK=rxG}yT#nG%I= zD=DNjn`XCHThSg$?^v2~8L5gL z6XUOx(G%^K5Aip;O*hqel|3@uOa15`UG7*gRY^5SI3^}u^ll{4=YAMG%_auwoOar6 zwu@G|PF5sk+|FU5T)@8Fqk&27TYb;Z8CU=vE#Fse)>_F zzOZNd<6$hjum^Efix~x{(oZW;T8^Z<>?+Qmx$Vhnr#HQHREvd}OqJa1ns3bDo%O0u zBk5>Pvq+dKV_x+%?fESMlr=KH-+nVSPeUBtrkQ|S4nGiAgYYCGyN7@?W?r{gI19F! zdBndGXenKpFq#e*(7JFs{Qe9`aK$4tdFoz2%N2BV8&Ok{46pG${}Uti9E}ylbja)V zG3aB<6tgG{z3vz{NG*vAgi{GZ1SsxD97M4pAu&>+w=c}CP!n!ZyJkJe^t&0aW0QlD z)~@UEc@NK;7fU4_#+F)}KZZU5=}rBhSd@O)@LOUe*q0#qDaeg-3rgO;N|0Vrr#>GF z+TvF>=563;C7J%PZ&AO_Xn0kncE#q&Sm+hh^xyf%0u()fG(i^T`0Fy8&=!2)w#s-| zpcYHklfI9I*wzC%Iau>{^os9QX6`%oZ{M_Jx?bcLxG)anK$5FFCggh*L4Al6g1OP; zJ(*&`YSp(D>*Wl}FkA7sakCHF7vg2OD(P2R2Q&P0a}no=!pE^BHSC=4e3MmnT#N$2 zOEERQS5swTPbjiYOC~ny2!EPKm02a2=TKRpUaWSDE6y4&4AcDtL{xUCCn)q}+W}?P zcJzF?D#&JHPJ5bCuZg;*7+n5H1JV3DVY;SP`+obi%!$=CS15lbQf&e<<5*pB?=Y6w z&zV!`Gye3$4w!j)~d27Fl05Yy!MJ_Z&am+WI z22vL<5|XYjnjJwsfsi=xdYj9blt)3r^!+=dG_tQ_Jg);ehmMkDbdJG_pYT zxxGSC1>0pr=Sh{3F=|h4z-jIwey$~hqM2UtVy5pg~v=Uq0xL%2BP^q zEBPFFUzeYO<#SDB&*fO0qw(Ulyg?`KTx8>|LDp)17@MbeGwNc8+7iNz8%PFf328sJx2I*(h?+gZKR@^YtpRtgiKuPT6jnz zD4y45b~K~da?SgD*l?n|nNv^_Lu>Q%a`CRey?GTmERc0%epW2<2(Z(zRk|NU-h`si z9!$}`8IW>5XzA~SRvD`%v>{Tk`*g#%CoXbU&8HyMQl&NrX04~tMb=D{JqT6^w`?0_ zX2VUJqBAy=wO+V?YY+4hI_Es2+82W&xecwJ!{Hb%QWRVdM!^6e)hTaAOO-9UiV!(L zB%$4l1l(~d+gE4poV=KLrx^FDP^K~a59#Uqg%yN{LDR^9y@HV0xWv0cnCy3+ySvSv zOR4%j;vg!6bofO<8y>Uo0!Lhd%G2olCC->%%SL5Fnr;qrC!AkC=Bz_S^avYl7Zx$V zAa?ZkvTU9=+RLpP^);yENEAYvw5n%o9>ov&SzcmV?3i4ByGaeEe00s}%c^GvhScet zHFst`ukhdyyc=U;y#-vBuwjY43#+{?RS)piAvlrOyGDd>huD=DFB8TZ4z2h-Z5nEWRr{9PMRXit6dh^%1|1=*jyeOxdi2GH&y%8?h&V17y z9}%kl*Mp@{y$`0|Kr|;<-|=SM7!9?7pz>D0+&g>k-0e;9jANPRzeYEAtv+b_r+3vs z-_1NF;Mu==N3k!Wx(@xEen4G_bjrANIf7~?MPX7 z4Wa|IXai_rtweL4M$|XfYj literal 0 HcmV?d00001