လွန်ခဲ့တဲ့ ၃၊၄ လလောက်က iOS Development စလုပ်ကြည့်မယ်ဆိုပြီး Angela Yu ရဲ့ iOS course လေးဝယ်ပြီး စလေ့လာဖြစ်တယ်။ စလုပ်ပြီးနောက် ၂လလောက်ကြာတော့ ရုံးမှာ iOS App လေးတစ်ခု ဝင်တာနဲ့ ကိုယ်တွေအတွက် ပထမဆုံး production app ဖြစ်လာခဲ့တယ်။ Android ရေးတာကနေ ပထမဆုံး iOS ကို စရေးတာဆိုတော့ သိတဲ့အတိုင်း တလွဲတွေ တောက်လျှောက်ဖြစ်တယ်။ ဒါနဲ့ ကြုံရခဲ့တဲ့ အခက်အခဲလေးတွေ အမှတ်တရဖြစ်အောင်ဆိုပြီး blog post လေးရေးမယ်ဆိုပြီး ဖြစ်လာတယ်။ ဆိုတော့ app လေးက ရိုးရှင်းပါတယ်။ လူ့အခွင့်အရေးသဘောတူညီချက်စာချုပ်တွေကို အင်္ဂလိပ်၊ မြန်မာ နှစ်ဘာသာနဲ့ ဖတ်လို့ရတဲ့ app လေးပဲ။ ခက်ခက်ခဲခဲအရမ်းကြီးမပါဘူး (လို့ထင်ခဲ့တာပေါ့နော်)
wrap_content မရှိ (or မသုံးတတ်)
Android framework မှာ ကောင်းတာတစ်ခုက wrap_content ပါတာပဲ။ အရင်တုန်းက ဘယ်လောက်အရေးကြီးလဲ မတွေးကြည့်ဖူးဘူး။ iOS ရောက်တော့ wrap content ဆိုတဲ့ “ကိုယ့် parent layout အောက်က child တွေရှိသလောက်နေရာယူပါမယ်” ဆိုတဲ့ အချက်မရှိဘူး။ ဘယ်မှာသွားသိသာလဲဆိုတော့ UITableView(Android မှာဆိုရင်တော့ ListView, RecyclerView) မှာသိသာတယ်။
ဉပမာ ဒီပုံကို တစ်ချက်ကြည့်ကြည့်မယ်ဆို ဒီ စာဖတ်တဲ့နေရာက အမှန်တော့ UITableView အကြီးကြီးတစ်ခု။ အထဲမှာမှ cell ပုံစံမျိုးစုံရှိတယ်။ စာချုပ်ခေါင်းစဉ်၊ နိဒါန်း၊ အပိုင်း၊ အပိုဒ် အစရှိသဖြင့်ပေါ့။ နောက်တစ်ခုက စာက ဘယ််လောက်ရှိမလဲကြိုမသိနိုင်ဘူး။ စာရှိသလောက် cell တစ်ခုကနေရာယူရမှာကို။ Android မှာဆို ဒီလိုကိစ္စကအများကြီးတွေးစရာတောင်မလိုမျိုး။ TextView
ထည့်၊ setText
ဆိုတာနဲ့ ပြီးပြီ။ သူ့ဟာသူ လိုသလိုနေရာယူပေးတယ်။ iOS မှာကျတော့ wrap_content မရှိတဲ့အခါကျ ဘယ်လိုလုပ်ရလဲဆိုတော့ Storyboard မှာ ချထားပြီးသား Design အတိုင်း အကုန် code နဲ့ပြန်ရေး ပြီးရင် view တွေရဲ့ height ကို ပေါင်း၊ ဒီလိုမှရတယ်။ မဟုတ်ရင် cell တွေက size အသေတွေဖြစ်ကုန်ရော။ ဒီတစ်ချက်ကတော့ ဘာလို့ ဒါလေးလုပ်ဖို့ ဒီလောက်ခက်ခဲရတာလည်း ဆိုပြီး အတွေးတစ်ခုတော့ ဝင်သွားတယ်။ Android မှာဆို ဒီလိုမျိုး တစ်ခါမှ မရေးဘူးတာ တော့အမှန်ပဲ။
UITableView
ရဲ့ rowHeight
ကိုလည်း UITableView.automaticDimension
သတ်မှတ်ပေးရတယ်။ estimatedRowHeight
ထည့်ပေးရတယ်။ တကယ်လို့ phone က cell size ကို calculate လုပ်တဲ့အခါ မြန်အောင်လို့ ဘယ်လောက်လောက်ရှိလောက်တယ်ဆိုပြီး သတ်မှတ်ပေးတာပေါ့။ ခက်တာက တစ်ခါတစ်လေ စက်က နှေးတဲ့အခါကျ estimatedRowHeight
နည်းနေရင် စာတွေက အပြည့်တက်မလာဘူး။ အဲတော့ ကိုယ်တွေလည်း မလုပ်တတ်တော့တာနဲ့ estimatedRowHeight
ကို အမြင့်ကြီးတွေပေးပလိုက်တယ် 😅 ။ Solution လေးရှိရင်ပြောကြပါဦိး။
Rewrite after rewrite
Reader View မှာ function က ဆန်းတာတစ်ခုတော့ပါတယ်။ ဘာလဲဆိုတော့ Reader View ကိုဝင်တဲ့ အချိန်မှာ မူလအစနေရာက ဝင်လာတဲ့နေရာပေါ်မူတည်ပြီးကွဲနိုင်တယ်။ ဆိုပါဆို့ ကျွန်တော်က “အပိုဒ် (၄)” ကိုနှိပ်မယ်ဆိုရင်အပိုဒ် (၄) စတဲ့ နေရာက စပြပေးမယ်။ ပြီးရင် မာတိကာက နေလည်း တစ်ဆင့် ခုန်ကျော်ပြီးသွားလို့ရတယ်။ ကိုယ်က အပေါ်အောက် ပွတ်နေရင်လည်း ရောက်နေတဲ့ နေရာကို မာတိကာမှာ မှတ်ထားပေးတယ်။
ဒီတော့ အဲမှာ စတွေ့တာပဲ။ စစက လွယ်ပါတယ်လေဆိုပြီး UIScrollView
တစ်ခုထည့်၊ အထဲမှာ UIStackView
ထည့်၊ အဲ့ထဲမှာမှ data ကို loop ပတ်ပြီး textview လေးတွေ လိုက်ထည့်။ အဲတာလေးနဲ့ပဲ လိုင်းက ၅၀၀၊ ၆၀၀ လောက်ရှိတယ်။ နောက်တော့ အာလုံးပြီးသွားတော့ အိုကေပြီပေါ့ဆိုပြီး စာနည်းနည်လေးနဲ့ စမ်းကြည့်တာ အဆင်ပြေတယ်။ တကယ့် ဒေတာ အစစ်လည်း ရောက်လာကော ပွတ်လိုက်တိုင်း ထစ်အထစ်အနဲ့ တိုင်တွေပတ်ကုန်ရော။ x,y တွေနဲ့ လက်စွမ်းပြထားတာဆိုတော့ ပိုဆိုးတာက scroll position ကိုတွက်တာမှာ သောက်သောက်လဲ မှားတာပဲ။ ဖတ်နေတာက အပိုဒ် (၃)၊ မာတိကာမှာက အပိုဒ်(၁) ဆိုပြီးပြ၊ မာတိကာက နှိပ်လိုက်ရင်လည်း ရောက်ချင်ရာရောက်နဲ့ ဖြစ်ချင်တိိုင်းတွေဖြစ်၊ လိုက်ကြည့်တော့လည်း code တွေက ကိုယ်တိုင်ရေးပြီး ကိုယ်ဟာကိုယ် နားမလည်။ကိုယ်တွေ သူငယ်ချင်း iOS Developer ကိုမေးတော့မှ “မင်းကကွာ၊ Table view နဲ့ cell indexPath ပေးလိုက်ရင် ရနေတာကို x,y တွေ တွက်နေတာကို” ဆိုတော့မှ ကိုယ်လည်း “ဒီလောက် ရုပ်ပျက်ဆင်းပျက်တော့ မဖြစ်သင့်ဘူး” ဆိုပြီး UITableView
နဲ့ အစအဆုံးပြန်ရေး ရပါလေကော။ (P.S ကူပေးတဲ့အတွက်လည်း တကယ်ကျေးဇူးတင်ပါတယ် )
UITableView
လေးနဲ့ကျမှပဲ တော်တော်လေး အဆင်ပြေးသွားတယ်။ ရေးလိုက်ရတာလည်း မနည်းဘူးကို။ နောက်ဆို ဘယ်လိုလုပ်ရမလဲသိတာပေါ့။ အရှုံးတော့ မရှိပါဘူး။တစ်ခြား အဲလို နည်းနည်းလေး အစကနေ ပြန်လုပ်ရတာလေးတွေလည်းရှိတယ်။ ပုံကို ဆာဗာကနေ ယူပြီး ပြတဲ့နေရာမှာ စစက ဘာ library မှမသုံးထားရကနေ Nuke, ပြီးတော့ အဲကနေမှ KingFisher ပြောင်းဖြစ်တယ်။ ပြေင်းတဲ့ အကြောင်းရင်း ကတော့ caching ကောင်းကောင်းလိုချင်လို့ပါပဲ၊ ဒါ့အပြင်ဘာမှာတော့ တစ်ခြားအကြောင်းအရင်း ကောင်းကောင်းတော့မရှိဘူး၊ စမ်းသုံးကြည့် ချင်တာလည်းပါတာပေါ့။ နောက် Home Screen ကို လည်း အသေထားထားရာကနေ UITableView
ပြောင်းရေးဖြစ်တယ်။
Phone Size မျိုးစုံ မစစ်မိ
Home Screen ဆိုလို့ စစက အသေရေးထားတာမှာ ပြဿနာတက်သေးတယ်။ iOS မှာ ဖုန်း အရွယ်အစားတွေ ကွဲသွားပြီဆိုတာ လုံးဝ ကို မေ့သွားပြီး size တွေကို pixel အတိအကျပေးထားလိုက်တယ်။ ပြီးတော့လည်း iPhone 8 လေးမှာပဲ စမ်းနေတာ။ Client လက်ထဲရောက်လို့ သူစမ်းကြည့်တော့မှ ကိုယ်တွေချထားတဲ့ ကဒ်လေးတွေက iPhone X မှာ ရုပ်ပျက်ဆင်းပျက်ဖြစ်နေတယ်။
အဲတော့မှ “အယ့် iOS မှာလည်း Android လို ဒီလို issue တွေရှိနေပြီပဲ” ဆိုပြီး တွေးမိတယ်။ ပြင်တာကတော့ မကြာပါဘူး၊ backdrop image ကို ပြင်လိုက်တာ အိုကေသွားတယ်။ တစ်ခုထပ် တွေးမိတာကတော့ အပေါ်မှာပြောခဲ့သလို wrap_content လိုမျိုး Android မှာရှိတာ ဒီလိုနေရာတွေကျကောင်းတယ်။ ကိုယ်တွေက အသေ pixel တွေရိုက်ထည့်ထားတော့ ဖုန်းမတူရင် ပြဲကားကုန်ကော၊ Android မှာကျတော့ အနည်းဆုံးတော့ သိပ်ပြီး စိတ်ပူစရာမလိုဘူး။ ခုကျမှ Android ရဲ့ layout frameworkတွေကို ပိုပြီးသဘောကျမိလာတယ်။
String.Index
ဒီတစ်ခုက ကိုယ်တွေ သေချာမလေ့လာမိတာလဲပါတယ်။ ဆိုတော့ feature ကရှင်းတယ်၊ စာပိုဒ်တွေထဲက စာကိုရှာမယ်။ တွေ့တယ်ဆိုရင် စာရဲ့ ရှေ့မှာ ၁၀ လုံးရှိလားကြည့်၊ ရှိတယ်ဆိုရင် ဖြတ်ပြီး တော့ အစက်သုံးစက်လေးထည့်။ ၁၀လုံး မရှိရင်တော့ အစကနေပဲစပြ။ ပြီးရင်ရှာတဲ့စာလုံးလေးကို highlight လေးတင်။ ကိုယ်တွေလည်း လွယ်ပါတယ်ပေါ့။ တကယ်က String Index ဖြတ်တာကို Android မှာလိုမျိုး integer
တွေနဲ့ပဲသွားထားတယ်ထင်တာ၊ iOS မှာက ဘာသာပေါင်းစုံ အဆင်ပြေအောင် String.Index ဆိုပြီး သတ်သတ်ရှိတယ်။ ဒါကို သေချာ မလေ့လာမိတော့ Index Out of Bounds ဖြစ်ပြီး crash တာ တော်တော်လေး ခေါင်းတွေခြောက်အောင် ရှင်းလိုက်ရတယ်။ Playground မှာလည်း တော်တောလေးစမ်းကြည့်လိုက်ရတယ်၊ Stackoverflow တွေလည်း တော်တော်မွှေလိုက်ရတယ်။ အမှန်တိုင်းဝင်ခံရရင် အခုထိလည်း အပြည့်အဝတော့ နားမလည်သေးဘူး၊ ဒါပေမဲ့ crash မဖြစ်အောင် ဘယ်လို သေချာ စစ်ရမလဲဆိုတော့ နည်းနည်းပါးပါး သိနေပြီ။ ။ အခုလက်ရှိ code က အလှကြီးတော့ မဟုတ်ပေမဲ့ အလုပ်တော့လုပ်တယ်။ လိုတာလေးတွေရှိရင်လည်း ထောက်ပြပေးကြပါဦိး။
App Store Rejection
ဒီလိုနဲ့ ဖွတ်ချက်ဖွတ်ချက် လာလိုက်တာ နောက်ဆုံး App Store ပေါ်တင်ကြမယ်ဟေ့ဆိုပြီး ပျော်ပျော်ရွှင်ရွှင် ပန်းဝင်ပြီထင်တာ၊ ဘယ်ဟုတ်မလဲ။ အပေါ်ရောက်တာနဲ့ reject မိတော့တာပဲ။ ဖြစ်တာက 4.2 Minimum Functionality နဲ့ထိတယ်။ စထိတာက 10 Aug မှာထိတယ်။ ဒါနဲ့ အသိတွေမေးကြည့်တော့ “Native functionality” လိုတယ်၊ Push Notification ထည့်ကြည့်ပါလား ပြောကြတယ်။ ဒါနဲ့ Convention အသစ်ထွက်လာတိုင်း ဒေါင်းလုပ် လုပ်လို့ရပြီဆိုပြီး Noti စပို့ကြည့်တယ်။ အဲဒါပြီးတော့ ထပ်တင်ကြည့်တယ်။
အဲမှာလည်း ထပ်ပြီး reject မိတယ်။ ဒီလို ဟိုဘက်ဒီဘက် ပြောကြရင်းနဲ့ နောက်ဆုံး ဖုန်းဆက်မယ်ဆိုပြီးဖြစ်လာရော။ သူစဆက်တဲ့အချိန်မှာ ဘတ်စ်ကားပေါ်ရောက်နေလို့ မကြားလိုက်ဘူး။ ဒါနဲ့ပြီးတော့မှ oversea call ဆိုတော့ ပြောနေတုန်းဖုန်းကျသွားမှာစိုးတာနဲ့ ဖုန်းဘေလ်အသည်းအသန်ဖြည့်၊ ပြီးတော့ ပြန်ခေါ်ရတယ်။ အဲ့တော့မှ ဟိုဘက်ကနေပြီး “သူတို့အနေနဲ့ နားလည်ပေမဲ့ တကယ့် feature ဖြစ်တဲ့ စာဖတ်တဲ့နေရာမှာ ဘာမှလုပ်လို့မရကြောင်း၊ အနည်းဆုံးတော့ စာကိုရွေးပြီး မှတ်သားထားလို့ရရင်ကောင်းကြောင်း” ပြောပြတယ်။
ဒါနဲ့ ရုံးရောက်တော့ ကိုယ့်အဖွဲ့ကလူတွေကို ပြောပြပြီး၊ အနည်းဆုံးတော့ မျှော်လင့်ချက်လေးရှိလာတော့ ရေးကြမယ်ဟေ့ဆိုပြီး အားပြန်တက်တယ်။ Feature လေးပြီးတော့ ပြန်တင်တယ်။ အဲဒီရက်တွေကကိုယ်တွေအတွက်တော့ အကြာဆုံးလိုပဲ။ မနက်မိုးလင်းရင် ပထမဆုံးကြည့်တယ်၊ နေ့လည် တစ်ခါကြည့်၊ ညအိပ်ခါနီးကြည့်နဲ့ မသိရင် App Store က ရည်းစားကျနေတာပဲ။
ဒါနဲ့ပဲ ထပ် reject မိတယ်။ ကိုယ်တွေလည်း ဘယ်ရမလဲ။ ထည့်ခိုင်းတာတာထည့်ပြီးပြီလေလို့ ပြန်ပို့တော့၊ အဲဒီ feature လေးအတွက် အဆင့်ဆင့်လုပ်ဆောင်ပုံလေး စမ်းဖို့ ပို့ပေးပါဆိုပြီးပြန်ပြောတယ်။ ဆိုတော့ သူတို့တောင်းတဲ့ instruction အပြင် ဗီဒီယိုဖမ်းထားတာလေးပါ ထည့်ပေးလိုက်တယ်။ တစ်ရက်အကြာမှာတော့ APPROVED ဖြစ်သွားတယ် 🎊
ခုတော့ App Store ပေါ်ရောက်နေပြီ။ စမ်းချင်ရင်အောက်က လင့်ခ်လေးမှာ ဝင်ကြည့်လို့ရတယ်။ Bug တွေတွေ့ရင်လည်း ပြောဦးနော် 😉
ဘယ်လိုပဲ အခက်အခဲတွေကြုံရကြုံရ ရေးရတာတော့ ပျော်တယ်။ ကိုယ့်ဟာကိုယ်လည်း အားရတယ်။ ကိုယ့် comfort zone ထဲကနေထွက်ပြီး တကယ့်ကို ရေနက်ထဲဆင်းလိုက် ရသလို ခံစားရတယ်။ Android framework တွေကိုလည်း ပိုပြီးတော့ သဘောကျသလို လိုတဲ့နေရာတွေလည်း သိလာရတယ်။ ကိုယ်တွေကတော့ iOS မှာလေ့လာဖို့အများကြီးကို လိုသေးတယ်၊ စာတွေလည်း တော်တော်ဖတ်ရဦးမှာ။ ရေးထားတာမှ လိုတာလေးတွေရှိရင်လည်း ပြောပြကြပါဦီး၊ တကယ့် iOS noob မလို့ သင်ပေးကြပါဦးလို့။