„iOS swift“ - setNeedsLayout vs layoutIfNeeded vs layoutSubviews ()

Aš visada galvojau apie šiuos metodus, kai kodavau „iOS“. Bandžiau skaityti daugiau ir tai supratau.

Paleidus „iOS“ programą, „UIApplication“ „iOS“ paleidžia pagrindinę programos vykdymo kilpą, kuri veikia pagrindine gija. Pagrindinė paleidimo kilpa apdoroja įvykius (pvz., Vartotojo prisilietimus) ir tvarko peržiūros pagrindu pateiktų sąsajų atnaujinimus. Įvykus įvykiams, tokiems kaip lietimas, vietos atnaujinimas, judesio ir daugialypės terpės valdymas, vykdymo kilpa randa įvykiams tinkamą tvarkyklę, iškviečia tinkamus metodus, kurie paskambina kitiems metodams ir pan. Tam tikru momentu visi įvykiai bus tvarkomi, o valdymas grįš į bėgimo ciklą. Pažymėkime šį tašką, kuriame valdymas grąžinamas į vykdymo ciklą kaip atnaujinimo ciklą.

Kol įvykiai apdorojami ir reikalaujama kai kurių pakeitimų vaizde, šie pakeitimai nėra atnaujinami iškart. Vietoj to sistema laukia, kol baigsis esamas procesas ir kada įvyks kitas perbraižymo ciklas. Tarp įvykio apdorojimo ir vartotojo sąsajos išdėstymo atnaujinimo tvarkymo yra periodiškas intervalas. Štai kodėl mes turime tinkamai suprasti aukščiau išvardintus tris metodus.

- setNeedsLayout ()

Metodas „setNeedsLayout“, skirtas UIView, nurodo sistemai, kurią norite, kad ji išdėstytų ir perbraižytų tą vaizdą ir visas jo peržiūras, kai ateina laikas atnaujinimo ciklui. Tai yra asinchroninė veikla, nes metodas užbaigiamas ir grįžtama iš karto, tačiau tik po kurio laiko iš tikrųjų įvyks išdėstymas ir perbraižymas, ir jūs nežinote, kada bus tas atnaujinimo ciklas.

„Apple doc“ sako: paskambinkite šiuo metodu naudodamiesi pagrindine programos gija, kai norite pakoreguoti rodinio pakabų išdėstymą. Šis metodas užrašo prašymą ir nedelsiant grąžinamas. Kadangi šis metodas nepriverčia nedelsiant atnaujinti, o vietoj to laukia kito atnaujinimo ciklo, prieš jį atnaujinant, galite jį naudoti negaliodami kelių rodinių išdėstymo. Toks elgesys leidžia sujungti visus išdėstymo atnaujinimus į vieną atnaujinimo ciklą, kuris paprastai yra geresnis našumui.

- layoutIfNeeded ()

Priešingai, metodas layoutIfNeeded yra sinchroninis skambutis, kuris praneša sistemai, kuriai norite išdėstymo ir perplanavo rodinio bei jo pogrupių išdėstymą ir norite, kad tai būtų padaryta iškart, nelaukiant atnaujinimo ciklo. Kai skambutis šiuo metodu bus baigtas, išdėstymas jau buvo pakoreguotas ir nupieštas atsižvelgiant į visus pakeitimus, kurie buvo pastebėti prieš skambinant metodu.

- layoutSubviews ()

Numatytasis įgyvendinimas naudoja visus jūsų nustatytus apribojimus, kad nustatytų bet kokių peržiūros dydį ir vietą.

Poklasiai gali nepaisyti šio metodo, jei reikia, kad būtų galima tiksliau išdėstyti savo pogrupius. Turėtumėte nepaisyti šio metodo tik tuo atveju, jei automatinis dydis ir apribojimais grindžiamas pogrupių elgesys nesiūlo jūsų norimo elgesio. Galite naudoti savo įgyvendinimą, kad tiesiogiai nustatytumėte savo pogrupių rėminius stačiakampius.

Jūs neturėtumėte vadinti šio metodo tiesiogiai. Jei norite priversti išdėstymo atnaujinimą, paskambinkite metodu „setNeedsLayout ()“, kad tai atliktumėte prieš kitą brėžinio atnaujinimą. Jei norite nedelsdami atnaujinti vaizdų išdėstymą, paskambinkite metodu layoutIfNeeded ().

Norėdami geriau suprasti, atsisiųskite ir paleiskite kodą „Github“. Tai radau iš žemiau pateiktos nuorodos.

Šaltinis: „Link1“, „apple docs“.