به نام خدا

گاهی اوقات یه صفحاتی رو باید طراحی کنید که یه ویو با سایز ثابت در بالا و تیبل ویو در زیر اون قرار داره ولی میخواید هنگام اسکرول کردن تیبل ویو اون ویو هم به سمت بالا بره و کامل اسکرول بشه تا چیزی ازش پیدا نباشه

خب پیاده کردن چنین چیزی توی اندروید به مراتب ساده تره به این شکل که ریسایکلر ویو رو توی یه اسکرول ویو میزارید و بالاش اون ویوی ثابت رو میزارید و ریسایکلر ویو رو هم روی wrap_content تنظیم میکنید فکر نمیکنم چیز دیگه ای مونده باشه که نگفته باشم

اما توی ios قضیه کمی فرق داره شما با اسکرول ویو دیگه کاری ندارید و همه چیز رو باید با کد بنویسید

توی استوری بورد خودتون یه ویوی ثابت (UIView) بزارید که دارای ارتفاع مشخص و ثابتی باشه (بهتره که از بالا و پایین فاصله نداشته باشه اگه تصمیم دارید از بالا یا پایین فاصله اش بدید یه ویوی دیگه توی این ویو بکشید و اونو فاصله بدید و رنگ اینو روی clear تنظیم کنید) حالا بعد از تنظیم constraint و ارتفاع ثابت و قرار دادن تیبل ویو زیر این ویو چند تا چیز رو توی کلاس کنترل درگ کنید یکیش همین ارتفاع و دیگری تیبل ویو هست که با گرفتن کنترل و کشیدن اون constraint توی کلاس مورد نظرتون یه outlet به اسم heightViewBoxConstraint بسازید

حالا با اضافه کردن UITableViewDelegate به کلاستون میتونید از تابع زیر استفاده کنید

func scrollViewDidScroll(_ scrollView: UIScrollView)

این تابع وقتی که تیبل ویو شما در حال اسکرول هست خیلی تند تند صدا زده میشه و میتونید ازش موقعیت اسکرول رو بگیرید

اصل مطلب اینجاست که شما با کد زیر میتونید برای اسکرول تیبل ویوتون یه رنج در نظر بگیرید که در اون رنج ارتفاع ویوی ثابتتون رو کم کنید تا اینجوری به نظر بیاد که داره اسکرول میخوره

کد زیر رو ببینید

  var oldContentOffset = CGPoint.zero
    let topConstraintRange = (CGFloat(0)..<CGFloat(140))

    func scrollViewDidScroll(_ scrollView: UIScrollView) {

        let delta =  scrollView.contentOffset.y - oldContentOffset.y

        //we compress the top view
        if delta > 0 && heightViewBoxConstraint .constant > topConstraintRange.lowerBound && scrollView.contentOffset.y > 0 {
            heightViewBoxConstraint .constant -= delta
            scrollView.contentOffset.y -= delta
        }

        //we expand the top view
        if delta < 0 && heightViewBoxConstraint .constant < topConstraintRange.upperBound && scrollView.contentOffset.y < 0{
            heightViewBoxConstraint .constant -= delta
            scrollView.contentOffset.y -= delta
        }
        oldContentOffset = scrollView.contentOffset
    }

 

به جای 170 باید ارتفاع ثابت اون ویوی خودتون رو قرار بدید (از توی استوری بورد روی اون ویو کلیک کنید و از سمت راست روی خط کش کلیک کنید اونجا نوشته Height اون رو بخونید و توی کد وارد کنید)

حالا برنامه رو اجرا کنید

به چند حالت ممکنه اسکرول بخوره ولی درست ترین اسکرولش اینه که ویو بره به سمت بالا

با اینکار ما ارتفاع ویوی خودمون رو به صفر رسوندیم و تیبل ویو رو تمام صفحه کردیم و حالا داریم اسکرول میکنیم (فکرکنم بهترین روشی بود که الحمدالله به ذهنم رسید)

اگه بعد از اجرا و اسکرول کردن دیدید که به صورت پارالاکس تیبل ویو از روی ویو شما میگذره بدونید که با تغییر constraint ها میتونید این شیوه اسکرول خوردن رو عوض کنید به این صورت که 3 تا کانسترینت پایین و چپ و راست رو برای ویوی داخل اون ویوی ثابت بزارید و یه ارتفاع هم بهش بدید تا به بهترین شکل اسکرول بخوره

انشاءالله که از این آموزش راضی باشید و به کارتون بیاد

تا آموزش های بعدی

یاعلی مدد