نحوه حذف حرکت تصویر زمینه در iOS 7. افکت اختلاف منظر در برنامه های iOS. از موشک گرفته تا گوشی

شاید مهم ترین نکته این باشد که اگر آیفون یا آیپد قدیمی دارید، از ارتقا به iOS 10 خودداری کنید. اگرچه، از آنجایی که شما در حال خواندن این مقاله هستید، دیگر برای ارائه چنین توصیه ای دیر شده است. اما ناامید نشوید، روش های اثبات شده دیگری نیز وجود دارد!

به iOS 10 زمان بدهید

iOS جدید تا لبه پر شده است توابع مختلف، که پس از راه اندازی اولیه شروع به نمایه سازی داده ها می کنند و حجم زیادی از منابع را مصرف می کنند. برای مثال، گالری داخلی تمام عکس‌های شما را از نظر چهره اسکن می‌کند و ممکن است باعث کندی سیستم و پاسخ‌دهی شود.

برای صرفه جویی در اعصاب خود، فقط باید به iOS زمان بدهید تا پس از راه اندازی اولیه، تمام فرآیندها را تکمیل کند. این معمولاً حدود هشت ساعت طول می‌کشد، بنابراین به‌روزرسانی در عصر راحت است و آیفون یا آی‌پد خود را یک شبه تنها بگذارید. در صبح متوجه خواهید شد که سیستم سریعتر کار می کند.

افکت اختلاف منظر را خاموش کنید

iOS 10 دارای انیمیشن های بیشتری است که به طور قابل توجهی پردازنده های آیفون و آیپد را به خصوص در دستگاه های قدیمی بارگذاری می کند. اگر هنگام کج کردن گوشی هوشمند یا تبلت، نمادهای دسکتاپ شما حرکت نکنند، ضرر بسیار کمی خواهید داشت. اما همه چیز خیلی سریعتر باز می شود.

تنظیمات → عمومی → دسترسی → کاهش حرکت

سوئیچ ضامن مورد نیاز ما در اعماق تنظیمات پنهان است. بیایید کلیک کنیم و لذت ببریم.

کاهش شفافیت رابط

جلوه ای دیگر از دسته تزئینات. رابط iOS 10 چیزهای زیادی دارد عناصر نیمه شفاف، از داک شروع می شود و با پنجره های پاپ آپ مختلف خاتمه می یابد. اگر آن را خاموش کنید، این همه زیبایی با جلوه های شیشه مات جایگزین پس زمینه های خاکستری خشن می شود، اما منابع اضافی را برای رندر هدر نمی دهد.


"تنظیمات" → "عمومی" → "دسترسی" → "افزایش کنتراست" → "شفافیت کمتر"

کلید تغییر جهت کاهش شفافیت در بخش "افزایش کنتراست" در کنار "کاهش حرکت" قرار دارد.

به روز رسانی برنامه های پس زمینه را غیرفعال کنید

تازه کردن داده ها در پس زمینه خوب است، اما آیا سه ثانیه منتظر ماندن برای فید توییتر یا فیس بوک شما ارزش بار اضافی را روی پردازنده دستگاه iOS شما دارد؟ علاوه بر این، این نیز یک بار بر روی باتری است و شما را از چند دقیقه محروم می کند عمر باتری.


"تنظیمات" → "عمومی" → "به روز رسانی محتوا"

یک بخش کامل در تنتورها با لیستی از همه وجود دارد برنامه های نصب شده. شما باید به آنجا بروید و مطمئن شوید که سوئیچ‌های ضامن فقط برعکس روشن هستند برنامه های کاربردی مورد نیاز. بهتر است به‌روزرسانی را به طور کامل غیرفعال کنید.

فضای ذخیره سازی را آزاد کنید

احتمالاً می‌دانید که iOS گاهی اوقات وقتی فضای خالی کمی از دیسک باقی می‌ماند، رفتار عجیبی از خود نشان می‌دهد. iOS 10 نیز از این قاعده مستثنی نیست: اگر فضای ذخیره سازی آیفون یا آیپد شما پر باشد، سرعت سیستم شروع به کند شدن می کند.


"تنظیمات" → "عمومی" → "ذخیره سازی و استفاده از iCloud"

به آمار استفاده خود نگاه کنید و حسابرسی انجام دهید. توصیه می شود حداقل 1 گیگابایت فضای خالی داشته باشید. اگر حذف برنامه ها نتایج دلخواه را به همراه نداشت، از پاک کننده استفاده کنید.

آیفون یا آیپد خود را ریستارت کنید

اگر قبلا این کار را انجام نداده اید، حتما دستگاه iOS خود را ریستارت کنید. پس از فعال شدن، فایل‌های موقت، حافظه پنهان و سایر مواردی که می‌توانند سرعت سیستم را کاهش دهند، حذف می‌شوند. یک iOS 10 تازه نصب شده دارای فراوانی از این آشغال‌ها خواهد بود، بنابراین برای راه‌اندازی مجدد و حذف هر چیز غیر ضروری تنبلی نکنید.


apple.com

برای راه اندازی مجدد باید همزمان فشار داده و نگه دارید دکمه خانهو دکمه پاور را تا زمانی که صفحه سفید شود و لوگوی اپل ظاهر شود. همچنین می توانید به سادگی آیفون یا آی پد خود را خاموش و روشن کنید. اثر مشابه خواهد بود.

ایده استفاده از اختلاف منظر در طراحی اپلیکیشن موبایل جدید نیست. مانند بسیاری دیگر، از دنیای طراحی وب به ما رسید، جایی که در ابتدا به یک روند بسیار رایج تبدیل شد. Parallax به طرح ها جلوه چشمگیری از عمق و حجم ظاهری می دهد. تا به امروز، به دلیل برخی از ناراحتی های مرتبط با ویژگی های توسعه برنامه های وب، مد اختلاف منظر در طراحی وب سایت فروکش کرده است. با این حال برنامه های موبایل- این یک مکالمه کاملا متفاوت است. Parallax در طراحی موبایل زنده و خوب است و هنوز به جایی نمی رسد و حتی به طور پیش فرض به آن اضافه شده است طراحی iOS 7 جدید !

در این مقاله ما در مورد مؤلفه DVParallaxView به شما خواهیم گفت و با استفاده از نمونه ای از دستگاه آن نشان می دهیم که چگونه دقیقاً همان جلوه اختلاف منظر را به برنامه اضافه کنید که در صفحه اصلی در iOS 7. و حتی بهتر.

اختلاف منظر چگونه کار می کند؟

بیایید برای لحظه ای به دنیای خشن فیزیک فرو برویم تا مکانیسم اثر اختلاف منظر را بهتر درک کنیم و برای خودمان ساختار دهیم. این به ما کمک می کند تا به طور قابل اعتماد آن را روی صفحه تلفن بازتولید کنیم.

پس اختلاف منظر چگونه کار می کند؟ ماهیت آن بسیار ساده است. اختلاف منظر تغییر در موقعیت یک جسم است که از دو نقطه متفاوت در فضا مشاهده می شود. شما می توانید این اثر را در دنیای واقعی در هر زمان مشاهده کنید. تنها چیزی که نیاز دارید چیزی بزرگ است که به عنوان پس‌زمینه عمل کند (مثلاً دیوار خانه) و مقداری شی قابل مشاهده در مقابل این پس‌زمینه که از پس‌زمینه به شما نزدیک‌تر باشد (مثلاً یک چراغ یا یک درخت). اگر هنگام تماشای تیر چراغ در کنار دیوار راه بروید، به نظرتان می رسد که تیر چراغ نسبت به دیوار در حال حرکت است. این اثر اختلاف منظر نامیده می شود - تغییر مکان ظاهری ستون نسبت به دیوار هنگامی که نقطه مشاهده، یعنی شما حرکت می کند. علاوه بر این، هرچه ستون به شما نزدیکتر باشد، سرعت جابجایی آن بیشتر به نظر می رسد. و برعکس، اگر فاصله قابل توجهی از ستون فاصله بگیرید و دوباره سعی کنید در امتداد دیوار خانه راه بروید، ستون عملاً نسبت به دیوار حرکت نمی کند. چشمان ما برای قضاوت در مورد فاصله اشیاء بر اساس عوامل زیادی آموزش دیده اند و یکی از آنها سرعت نسبی جابجایی جسم است. اگر صحنه ای را تماشا می کنید که در آن اشیاء در حین حرکت شما حرکت می کنند در سرعت های مختلف- چشمان شما بلافاصله به مغز شما می گوید که اشیا روشن هستند در فواصل مختلفاز شما این زیبایی استفاده از اختلاف منظر در طراحی است - با تقلید از آن، می توانید به یک صحنه مسطح عمق دهید.

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

بیایید اجزای اصلی این اثر را برجسته کنیم. اولاً، برای اختلاف منظر تلفظ، مطلوب است که پس‌زمینه‌ای داشته باشیم که در حالت ایده‌آل ساکن باشد، یا جابه‌جایی آن در مقایسه با اجسام دیگر ناچیز باشد. ثانیاً، اختلاف منظر فقط در صورتی قابل مشاهده است که اجسامی وجود داشته باشند که فضای بین پس‌زمینه و نقطه مشاهده را پر کنند. و مهمترین نکته در مورد این اشیا تفاوت فاصله آنها با شماست. به عبارت دیگر، اشیاء باید نوعی سلسله مراتب را تشکیل دهند و در فواصل مختلف از دیدگاه تا پس زمینه صف آرایی کنند. و بالاخره ثالثاً اختلاف منظر بدون حرکت اجسام نسبت به نقطه مشاهده با سرعت های مختلف غیرممکن است.

اگر هر سه جنبه اصلی وجود داشته باشند - پس زمینه، اشیاء و حرکت نسبی - اختلاف منظر را مشاهده خواهیم کرد.

پیمایش اختلاف منظر

اکنون که می دانیم پارالکس چگونه کار می کند، باید تصمیم بگیریم که دقیقاً چگونه آن را در کد پیاده سازی کنیم.

واضح ترین رویکرد برای پیاده سازی اختلاف منظر، پیمایش اختلاف منظر است. آیا هیچ بازی پلتفرم قدیمی بازی کرده اید؟ اگر چنین است، به احتمال زیاد می توانید به یاد داشته باشید که در حالی که شخصیت از سمت چپ سطح به سمت راست در حال اجرا بود، اشیاء در پس زمینه با سرعت های متفاوت بسته به فاصله تخمینی از پیش زمینه در جهت مخالف حرکت می کردند. این یک پیوند به ویکی پدیا است تا دقیقاً به یاد داشته باشید که در مورد چه چیزی صحبت می کنیم.

پیمایش اختلاف منظر در بازی ها به گونه ای طراحی شده بود که صحنه ای که روی صفحه می بینید از چندین لایه تشکیل شده است که اجسام روی آن ها قرار دارند. بسته به فاصله در نظر گرفته شده لایه از صفحه نمایش (لایه "جنگل" از لایه "ابرها" به شما نزدیکتر است، که از لایه "خورشید" به شما نزدیکتر است)، لایه ها با سرعت های متفاوتی حرکت می کنند. این به آنچه روی صفحه اتفاق می‌افتد عمق خاصی می‌دهد و باعث می‌شود یک تصویر صاف حجیم‌تر به نظر برسد. باید اعتراف کرد که این رویکرد به خوبی با آنچه در مورد اختلاف منظر آموخته ایم همبستگی دارد. در واقع، شما می توانید به طور ذهنی فضای بین خود و پس زمینه را به لایه هایی تقسیم کنید که شامل اشیاء موجود در آن فضا است.

منطقی است که فرض کنیم اجرای اثر اختلاف منظر باید در یک مولفه ظرف خاصی که شامل اجزای دیگر و دارای سلسله مراتب مشخصی از نماها است، محصور شود، که بسته به موقعیت در سلسله مراتب، موقعیت آن با فاصله تغییر می کند. بیایید در مورد آن فکر کنیم: آیا عنصری در UIKit وجود دارد که قبلاً دارای ویژگی مشابه باشد؟ البته دارند! هر UIView حاوی سلسله مراتبی از سایر UIView است که با استفاده از متد addSubview: در آن قرار داده شده است.

در اینجا به ایده اصلی پشت مؤلفه DVParallaxView می رسیم. ایده این است که کامپوننت فرزند یک UIView باشد که اثر اختلاف منظر را در بر می گیرد. خود این افکت با ارسال یک مقدار جدید به ویژگی contentOffset که از نوع CGPoint است پیاده سازی می شود. بنابراین، DVParallaxView از نظر معنی مشابه UIScrollView است. هنگامی که مقدار contentOffset را تغییر می دهیم، مکان هر نمای واقع در سلسله مراتب DVParallaxView را تغییر می دهیم. مقدار جابجایی به طور معکوس به فاصله عنصر از "بالای" سلسله مراتب بستگی دارد. و از آنجایی که عناصر در آرایه زیرنماها با شروع از پایین‌ترین سلسله مراتب (یعنی از دورترین نقطه از صفحه) ذخیره می‌شوند، هنگام عبور مستقیم از آرایه، افست مستقیماً به شاخص عنصر پردازش شده بستگی دارد. به این ترتیب ما وجود "فاصله" بین عناصر را مانند دنیای واقعی تفسیر می کنیم. برای کنترل مقدار فاصله، in را نمایش خواهیم داد قسمت جلوییخاصیتی که نشان دهنده یک ضریب است که در آن شاخص یک عنصر در آرایه ضرب می شود. با تنظیم آن، همیشه می توانید مقدار اختلاف منظر را به دلخواه تنظیم کنید.

خوب، مدل پیشنهادی قابل اجرا به نظر می رسد، تمام نکات اصلی مورد بررسی قرار گرفته است. در اینجا می توان به آشنایی خود با دستگاه پارالاکس مفهومی در DVParallaxView پایان داد و داستان اجرای عملی آن را آغاز کرد.

یک DVParallaxView ایجاد کنید

در این فصل و فصل بعدی، نگاهی دقیق تر به ایجاد کامپوننت DVParallaxView خواهیم داشت.

قبل از شروع مستقیم به پیاده سازی، اجازه دهید چند ویژگی دیگر از کلاس DVParallaxView را تعریف کنیم.

اولا، اختلاف منظر بهترین به نظر می رسد و اغلب در پس زمینه برخی انجام می شود عکس زیبا(به یاد داشته باشید، ما تصمیم گرفتیم که یکی از اجزای مورد نیاز اختلاف منظر پس زمینه است؟). بنابراین در کلاس ما لازم است قابلیت تنظیم تصویر پس زمینه فراهم شود. در ریشه سلسله مراتب view همیشه یک عنصر خصوصی از کلاس UIImageView وجود خواهد داشت که ما آن را backgroundImageView می نامیم. این عنصر به عنوان پس زمینه در DVParallaxView عمل می کند. مکان آن در ریشه سلسله مراتب، کوچکترین جابجایی نسبی را برای ما تضمین می کند، همانطور که مناسب پس زمینه، دورترین شی در صحنه است. برای انتقال تصویر پس زمینهدر رابط عمومی کامپوننت یک ویژگی خاص وجود خواهد داشت - backgroundImage از کلاس UIImage.

ثانیاً، اثر اختلاف منظر در iOS 7 شامل چیزی بیش از تغییر مکان پس‌زمینه است. اگر دقیق‌تر نگاه کنید، متوجه یک جزئیات عجیب خواهید شد: نمادها در جهت مخالف تغییر پس‌زمینه جابه‌جا می‌شوند. این کار برای تقویت جلوه منظر و کنتراست بین پس‌زمینه در حال تغییر و نمادهای برنامه، که در نگاه اول بی‌حرکت هستند، انجام شد. از آنجایی که ما قصد داریم در iOS 7 به اختلاف منظر دست پیدا کنیم و از آن پیشی بگیریم، به سادگی باید چنین ویژگی را به مؤلفه خود اضافه کنیم. برای این کار یک خاصیت frontView در رابط عمومی ایجاد می کنیم که نمای مورد نظر را در جهت مخالف اختلاف منظر به آن منتقل می کنیم.

بنابراین، تمام آماده سازی ها انجام شده است - تئوری مورد مطالعه قرار گرفته است، طراحی جزء اندیشیده شده است. می توانید شروع به ایجاد DVParallaxView کنید. آماده؟

یک پروژه تک نمای در XCode ایجاد کنید، نام و سایر ویژگی های لازم را به آن بدهید. در داخل پروژه، یک کلاس DVParallaxView ایجاد کنید که از نسل کلاس UIView است. یک فایل هدر DVParallaxView ایجاد کنید و آن را به صورت زیر پر کنید.

#وارد كردن @interface DVParallaxView: UIView @property (غیر اتمی، قوی) UIImage *backgroundImage. @property (غیر اتمی، قوی) UIView *frontView. @property (غیر اتمی) float parallaxDistanceFactor; @property (غیر اتمی) float parallaxFrontFactor; @property (غیر اتمی) CGPoint contentOffset; @پایان

ما قبلاً در مورد تمام خصوصیات کلاسی که در بالا می بینید صحبت کرده ایم، بنابراین مجموعه آنها به هیچ وجه نباید شما را شگفت زده کند. دو ویژگی که قبلاً به صراحت مورد بحث قرار نگرفتند - parallaxDistanceFactor و parallaxFrontFactor - همان ضرب کننده هایی هستند که به ترتیب برای کنترل میزان جابجایی عناصر سلسله مراتبی و نمای جلویی کار می کنند.

در فایل پیاده سازی کلاس، یک رابط خصوصی ایجاد کنید. شما باید ویژگی backgroundImageView را در آن قرار دهید، زیرا نیازی به دسترسی عمومی به کلاس نیست.

@interface DVParallaxView() @property (غیر اتمی، قوی) UIImageView *backgroundImageView; @پایان

اجازه دهید یک شی کلاس با فراخوانی متد initWithFrame: ایجاد شود. هنگام فراخوانی آن، باید تمام تنظیمات اولیه را انجام دهید.

- (id)initWithFrame:(CGRect)frame (self = ; if (self) (self.parallaxDistanceFactor = 2.f; self.parallaxFrontFactor = 20.f; self.backgroundColor = ; ؛ UIPanGestureRecognizer *panRecognizer:Teaction:ingetWarh = [ :@selector(panHandler:)]; ;) بازگشت به خود؛)

ما این مقادیر چند برابر را بر اساس ترجیحات شخصی خود تنظیم می کنیم. اگر اختلاف منظر خیلی قوی یا برعکس خیلی ضعیف به نظر می رسد، می توانید مقادیر دیگری را انتخاب کنید. توجه داشته باشید که پس زمینه از همان ابتدا در سلسله مراتب view قرار دارد، حتی اگر هیچ تصویری به آن اختصاص داده نشده باشد.

اگر قبلاً سؤال "چگونه جابجایی نماها را در مؤلفه شروع کنیم؟" پرسیده اید، می توانید پاسخ آن را در کد اولیه - UIpanGestureRecognizer ببینید. بله، ما به یاد داریم که در iOS 7 اختلاف منظر ناشی از کج شدن گوشی بود. هر چیزی زمان خودش را دارد.

انتخابگر روش panHandler: به UIPanGestureRecognizer منتقل شد. بیایید بلافاصله این روش را بنویسیم تا بعداً فراموش نکنیم که آن را انجام دهیم.

#علامت پراگما - کنترل کننده اشاره - (void)panHandler:(UIPanGestureRecognizer *)pan (ترجمه CGPoint = ; ; ; )

هیچ چیز غیرعادی نیست حرکت لمس را می خوانیم و همان مقدار افست را برای DVParallaxView خود تنظیم می کنیم. فراموش نکنید که افست حاصل را در پایان به صفر برگردانید.

الان قسمت خوبش شروع میشود. تا کنون هیچ اتفاقی در هنگام تغییر محتوای Offset رخ نداده است، بیایید آن را برطرف کنیم. مطابق شکل زیر یک متد تنظیم کننده setContentOffset ایجاد کنید.

-(void)setContentOffset:(CGPoint)contentOffset ( BOOL backgroundReachedEdgeX = NO؛ BOOL backgroundReachedEdgeY = NO؛ double contentDivider؛ //1 if (self.backgroundImageView) (contentDivider = self.subviews.count*SelfMaintGPointGPointGactor. (self.backgroundImageView.center.x + (contentOffset.x - _contentOffset.x)/contentDivider, self.backgroundImageView.center.y - (contentOffset.y - _contentOffset.y)/contentDivider)؛ اگر ((x -newCenter. .backgroundImageView.frame.size.width/2.f) > 0.f || (newCenter.x + self.backgroundImageView.frame.size.width/2.f)< self.bounds.size.width) { newCenter.x = self.backgroundImageView.center.x; backgroundReachedEdgeX = YES; } if ((newCenter.y - self.backgroundImageView.frame.size.height/2.f) >0.f || (newCenter.y + self.backgroundImageView.frame.size.height/2.f)< self.bounds.size.height) { newCenter.y = self.backgroundImageView.center.y; backgroundReachedEdgeY = YES; } self.backgroundImageView.center = newCenter; } // //2 for (int i = 1; i

بنابراین، اجازه دهید روش را با جزئیات بیشتری بررسی کنیم. متغیرهای backgroundReachedEdgeX و backgroundReachedEdgeY نشان می‌دهند که با حرکت دادن پس‌زمینه به لبه تصویر رسیده‌ایم. اگر پس‌زمینه تنظیم شده باشد، منطقی است که بررسی کنیم آیا از backgroundImage فراتر رفته‌ایم یا خیر. از این گذشته، ما نمی خواهیم کاربران به "شکستن" تصویر فکر کنند؛ این تصویر غیرطبیعی به نظر می رسد. بنابراین لازم دانستیم در صورت وجود، ناحیه اختلاف منظر را به اندازه تصویر پس زمینه محدود کنیم. بنابراین، بلوک //1 حاوی یک بررسی برای فراتر رفتن از محدودیت های تصویر است.

بلوک //2 عبور از تمام عناصر سلسله مراتب نمای با محاسبه مقادیر جابجایی مراکز آنها بسته به موقعیت آنها در سلسله مراتب است. همچنین اگر در امتداد محورهای X یا Y در لبه تصویر پس‌زمینه باشیم، جابه‌جایی در امتداد این محورها رخ نخواهد داد.

منطق اصلی جابجایی ایجاد شده است، تنها چیزی که باقی می ماند تنظیم روش های دسترسی به ویژگی های اصلی و همچنین بارگذاری بیش از حد متد addSubview است.

#pragma mark - Getters -(UIImageView *)backgroundImageView ( if (!_backgroundImageView) ( _backgroundImageView = [init]؛ _backgroundImageView.contentMode = UIViewContentModeCenter؛ _backgroundImageView.MadeCenter; MidY (self.bounds)) ; ) return _backgroundImageView; ) #علامت پراگما - تنظیم کننده ها -(void)setParallaxDistanceFactor:(float)parallaxDistanceFactor ( _parallaxDistanceFactor = MAX(0.f، parallaxDistanceFactor); ) -(void)rontParallaxDistanceFactor rontFactor = MAX( 0 .f، parallaxFrontFactor؛ ) -(void)setBackgroundImage:(UIIimage *)backgroundImage ( _backgroundImage = backgroundImage؛ ؛ CGPoint source = CGPointMake(CGRectGetMidX(self.bounds) -backgroundImagedGR/size.size.f . کرانه ها) - backgroundImage.size.height/2.f؛ self.backgroundImageView.frame = (CGRect) (.origin = مبدا، .size = backgroundImage.size); ) -(void)setFrontView:(UIView *)frontView ( _frontView = frontView; ; ) علامت #pragma - Overriding -(void)addSubview:(UIView *)view ( if (self.frontView) ; else ; )

به ترتیب بریم با دریافت کننده backgroundImageView همه چیز واضح است - نمونه تنبل معمولی، ما شی را فقط در صورت لزوم ایجاد می کنیم. تنظیم مقادیر ParallaxDistanceFactor و ParallaxFrontFactor به طور خودکار مقادیر منفی را بررسی می کند. تنظیم کننده backgroundImage تصویر پس زمینه را در backgroundImageView تنظیم می کند و به طور همزمان موقعیت آن را روی صفحه متمرکز می کند. تنظیم کننده frontView به طور همزمان frontView را به سلسله مراتب زیرنما اضافه می کند، بنابراین اضافه کردن دستی آن فایده ای ندارد. در نهایت، اگر DVParallaxView یک frontView تعریف نشده باشد، addSubview: overload به طور معمول کار می کند، اما اگر تعریف شده باشد، هر نما یک موقعیت زیر آن در سلسله مراتب خواهد بود. پس از همه، فرض بر این است که frontView همیشه در جلو است.

بیایید فعلاً آن را رها کنیم و به viewController اصلی پروژه آزمایشی خود برویم. وقت آن رسیده است که کامپوننت جدید خود را متصل کرده و آن را در عمل آزمایش کنیم. از آنجایی که می‌خواهیم شبیه صفحه اصلی جدید در iOS 7 باشیم، در پروژه آزمایشی سعی می‌کنیم دقیقاً آن را بازسازی کنیم. برای این کار به یک تصویر پس زمینه (ترجیحا با تصویر فضا) و آیکون های اپلیکیشن نیاز داریم. علاوه بر این، از آنجایی که کامپوننت ما از اشیاء دیگر بین پس‌زمینه و پیش‌زمینه پشتیبانی می‌کند، آنها را نیز اضافه خواهیم کرد. از آنجایی که فضا پس‌زمینه است، موضوع فضایی را توسعه می‌دهیم و فضای متروکه را با سیاره زمین و ماهواره آن، ماه، زنده می‌کنیم. می توانید تمام تصاویر لازم را در اینترنت پیدا کنید یا آنها را از پروژه آزمایشی ما در github دریافت کنید.

در iOS 7، آیکون های برنامه ها در پیش زمینه هستند، بنابراین در DVParallaxView باید آنها را در frontView قرار دهیم. برای این کار یک UIView ایجاد می کنیم که تمام آیکون ها را در آن قرار می دهیم. برای جلوگیری از ایجاد و قرار دادن دستی همه این اجزا، ظرف و نمادها را در استوری بورد ایجاد کنید، سپس آنها را به کنترلر متصل کنید.

این همان چیزی است که نمای جلو در برنامه آزمایشی ما به نظر می رسد. ظرف UIView را به عنوان یک IBOoutlet به کنترلر متصل کنید و نام آن را frontView بگذارید. بیایید شروع به ایجاد یک نمونه DVParallaxView کنیم.

یک ویژگی parallaxView در رابط خصوصی کنترلر خود ایجاد کنید. یک گیرنده برای این ملک ایجاد کنید.

-(DVParallaxView *)parallaxView ( if (!_parallaxView) ( _parallaxView = [ initWithFrame:self.view.bounds]؛ [_parallaxView setBackgroundImage:]؛ UIImageView *earth = [ initWithImage:] (Grect. = CGPointMake(CGRectGetMidX(self.view.bounds) - earth.image.size.width/2.f، CGRectGetMidY(self.view.bounds) - earth.image.size.height/2.f)، .size = زمین .frame.size)؛ [_parallaxView addSubview:earth]؛ UIImageView *moon = [initWithImage:]؛ moon.frame = (CGRect) (.origin = CGPointMake(CGRectGetMidX(self.view.bounds) + 30.f,Mid(CGRect) self.view.bounds) + 30.f)، .size = moon.frame.size؛ [_parallaxView addSubview:moon]؛ [_parallaxView setFrontView:self.frontView]؛ ) return _parallaxView؛ )

کد نشان می دهد که چگونه پس از ایجاد یک نمونه از کلاس DVParallaxView، پس زمینه "galaxy2" به آن داده می شود، سپس تصاویر زمین و ماه به سلسله مراتب view اضافه می شوند. سپس ویژگی frontView به عنوان پیش زمینه تنظیم می شود. اکنون تنها کاری که باید انجام دهیم این است که جزء خود را به سلسله مراتب نمای کنترلر اضافه کنیم. این خط را به متد viewDidLoad اضافه کنید:

;

Parallax آماده است، می توانید پروژه را راه اندازی کنید. همانطور که می بینید، مؤلفه ای که ما قبلاً در این مرحله از توسعه آن ایجاد کردیم یک اثر اختلاف منظر کاملاً قابل اعتماد ارائه می دهد.

فقط یک جزئیات باقی مانده است در حال حاضر، حرکت عناصر با استفاده از لمس انجام می شود. وقت آن است که این را درست کنیم. زمان اتصال ژیروسکوپ به DVParallaxView فرا رسیده است.

اتصال هسته حرکت

اگر مقاله ما را خوانده اید، پس از قبل تمام مهارت های لازم برای استفاده از ژیروسکوپ در این پروژه را دارید و همچنین می دانید که برای اتصال ژیروسکوپ باید چارچوب Core Motion را به پروژه اضافه کنید. اما دقیقاً چگونه از داده های حسگر استفاده خواهیم کرد؟ در پروژه خود، نرخ چرخش را برای نشان دادن شیب گوشی انتخاب کردیم. یعنی اگر سرعت چرخش زاویه ای غیر صفر وجود داشته باشد، محتوای Offset تغییر می کند.

فریم ورک را به فایل پیاده سازی کلاس DVParallaxView متصل کنید.

#وارد كردن

سپس ویژگی های motionManager و displayLink را در رابط خصوصی کلاس ایجاد کنید.

@property (غیر اتمی، قوی) CMMotionManager *motionManager;

@property (غیر اتمی، قوی) CADisplayLink *displayLink;

CMMotionManager کلاس اصلی CoreMotion است که برای دسترسی به داده های حسگر استفاده می شود. CADisplayLink یک تایمر است که با نرخ تازه سازی صفحه کار می کند، که روش به روز رسانی داده های ژیروسکوپ را فراخوانی می کند.

حالا بیایید متدهای دسترسی را برای ویژگی های جدید اضافه کنیم.

-(CADisplayLink *)displayLink ( if (!_displayLink) ( _displayLink = ; ) return _displayLink; ) -(CMMotionManager *)motionManager ( if (!_motionManager) ( _motionManager = [ init]؛ _motionManager.deviceMotionUpdate. ;)

بدیهی است که توسعه‌دهنده‌ای که از مؤلفه DVParallaxView استفاده می‌کند، لزوماً همیشه نیازی به استفاده از ژیروسکوپ نخواهد داشت. ممکن است شرایط و اقدامات دیگری برای تغییر مقدار contentOffset وجود داشته باشد. بنابراین، کامپوننت باید توانایی انتخاب پارالاکس را از طریق ژیروسکوپ فراهم کند. برای ارائه این انتخاب، ویژگی gyroscopeControl را در معرض اینترفیس عمومی قرار می دهیم که از نوع BOOL خواهد بود. اگر روی YES تنظیم شود، مؤلفه شروع به خواندن ژیروسکوپ و جابجایی عناصر سلسله مراتبی در هنگام کج شدن دستگاه می کند. اگر روی NO تنظیم شود، قطعه به تغییرات سرعت زاویه ای دستگاه پاسخ نمی دهد. در این حالت، ویژگی‌های motionManager و displayLink باید کار خود را متوقف کنند تا منابع پردازنده هدر نرود.

همانطور که توافق کردیم، یک ویژگی gyroscopeControl در رابط عمومی ایجاد کنید.

@property (غیر اتمی، قوی) ژیروسکوپ کنترل BOOL;

سپس یک ستر برای آن بسازید.

-(void)setGyroscopeControl:(BOOL)gyroscopeControl ( if (_gyroscopeControl == gyroscopeControl) بازگشت؛ _gyroscopeControl = gyroscopeControl؛ if (gyroscopeControl) (; forMode:NSDefaultRunLoopMode]؛ ) else (; ; self.motionMana;)

توجه داشته باشید که وقتی ویژگی را روی YES تنظیم می کنید، motionManager به جای ژیروسکوپ، خواندن را از deviceMotion دریافت می کند. دلایل این انتخاب به تفصیل در مقاله توضیح داده شده است. با تنظیم آن بر روی NO، بازیابی اطلاعات متوقف می شود، displayLink با فراخوانی متد invalidate از تمام رشته ها حذف می شود و خود motionManager روی صفر تنظیم می شود.

اکنون تنها کاری که باید انجام دهیم این است که یک روش برای تبدیل داده ها از ژیروسکوپ به داده برای contentOffset بنویسیم و همچنین متد displayLinkHandler را که در تایمر displayLink فراخوانی می شود، پیاده سازی کنیم.

#علامت پراگما - ژیروسکوپ به افست - (CGPoint)contentOffsetWithRotationRate:(CMRotationRate)rotationRate ( xOffset دوبرابر = (fabs(rotationRate.y) > DV_ROTATION_THRESHOLD)?rotationRate.y*DV_ROTATIONLI:Obset =DV_ROTATION_MULTI; x) > DV_ROTATION_THRESHOLD)?rotationRate.x*DV_ROTATION_MULTIPLIER:0.f;CGPoint newOffset = CGPointMake(self.contentOffset.x + xOffset، self.contentOffset.y + yOffset)؛ بازگرداندن (play newOffset;]Hvoid; )

فراموش نکنید که در همان ابتدای فایل پیاده سازی دو ثابت تعریفی را که در عملیات روش تبدیل استفاده کردیم، توضیح دهید.

#define DV_ROTATION_THRESHOLD 0.1f

#define DV_ROTATION_MULTIPLIER 2.5f

در کلاس کنترلر، هنگام ایجاد یک شی DVParallaxView، ویژگی gyroscopeControl آن را روی YES قرار دهید.

بنابراین، ژیروسکوپ متصل است، داده های آن اکنون باید به درستی به جابجایی تبدیل شوند. اکنون می توانید پروژه را کامپایل کرده و روی دستگاه اجرا کنید. عالی به نظر می رسد، اینطور نیست؟ توجه داشته باشید که ژیروسکوپ فقط روی یک دستگاه واقعی کار می کند.

نتیجه

اگر در حال خواندن این پاراگراف هستید، به این معنی است که به تازگی یک مؤلفه جداگانه با جلوه منظر ایجاد کرده اید، مانند iOS 7. و حتی بیشتر - افکت در مؤلفه DVParallaxView کامل تر است، زیرا نه تنها پس زمینه و پیش زمینه را تغییر می دهد. ، بلکه کل سلسله مراتب عناصر بین آنها. همانطور که می بینید، دستگاه او به هیچ وجه پیچیده نیست.

DVParallaxView توسط ما برای استفاده رایگان ایجاد شده و در مخزن ما ارسال شده است. از آن استفاده کنید، آن را بهبود بخشید، ما از دیدن پیشنهادات شما خوشحال خواهیم شد!

همه ما می دانیم که اپل در تلاش است تا از تمام دسته های کاربران خود مراقبت کند و قابلیتی مانند کاهش حرکت را در آیفون منتشر کرده است.

بسیار مفید است و توضیح منطقی از ایجاد و البته کاربرد آن دارد. بیایید بفهمیم که چیست و چگونه می توان آن را فعال کرد.

کاهش حرکت در iOS چیست؟

اجازه دهید با این واقعیت شروع کنم که با ظهور iOS 7 تغییرات زیادی ایجاد شد و یکی از آنها ویژگی عمق بصری صفحه بود.

اگر یک تصویر زمینه استاندارد خاص را روی آیفون خود تنظیم کنید، وقتی دستگاه حرکت می کند، حرکت می کند و همه چیز بسیار چشمگیر به نظر می رسد.

با گذشت زمان، انیمیشن های بهبود یافته برای باز کردن برنامه ها نیز ظاهر شدند. انیمیشن های انتقال و خیلی چیزهای دیگر نیز بهبود یافته اند.

اگر کاربر به سادگی به این نیاز نداشته باشد، می توان با استفاده از عملکرد "Reduce Motion" همه چیز را خاموش کرد. که به صرفه جویی در مصرف باتری نیز کمک می کند.

کمی بعداً در مورد فعال کردن آن صحبت خواهیم کرد، اما در حال حاضر می‌خواهم لیستی از مواردی که پس از فعال‌سازی غیرفعال می‌شود را ذکر کنم:

  • انیمیشن در برنامه استاندارد آب و هوا حذف می شود.
  • تمام جلوه های صفحه نمایش به طور کامل تغییر کرده است.
  • افکت اختلاف منظر، آنچه در مورد کاغذ دیواری توضیح دادم نیز غیرفعال است.
  • خوب و برخی دیگر برنامه های کاربردی استاندارد، همچنین استفاده از انیمیشن را متوقف کنید.

من فکر می کنم شما ماهیت اصلی این عملکرد را درک کرده اید و اکنون زمان آن رسیده است که به قسمتی بروید که به شما می گویم چگونه عملکرد را به درستی فعال کنید یا در صورت لزوم آن را غیرفعال کنید.

چگونه کاهش حرکت را در آیفون روشن/خاموش کنیم؟

من این بخش را با این واقعیت شروع می کنم که اغلب این عملکرد در دستگاه های قدیمی یا تلفن هایی استفاده می شود که باتری آنها قبلاً حجم آنها کاهش یافته است.


این به این معنی است که برای افزایش عمر باتری آیفون شما و اگر دارید استفاده می شود مدل قدیمیو نمی خواهید دستگاه خود را در آخرین نسخه iOS به خوبی اجرا کند.

خوب، اکنون می توانید عملکرد کاهش حرکت را روشن کنید:

  1. مثل همیشه بریم به تنظیمات- به دنبال یک آیتم پایه ای;
  2. برویم به دسترسی جهانیحرکت را کاهش دهید;
  3. آیتمی را با همین نام می بینیم و به سادگی آن را فعال می کنیم تا سبز شود.


در پایین ممکن است مورد دیگری به نام "پیام افکت (خودکار)" را مشاهده کرده باشید. بهتر است آن را فعال نگه دارید.

اگر آن را خاموش کنید، وقتی شخصی برای شما پیام هایی با جلوه هایی مانند بادکنک، آتش بازی و موارد دیگر ارسال می کند، به سادگی کار نمی کنند.

من در حال حاضر از iPhone 5S استفاده می کنم و به محض اینکه به iOS 10 تغییر دادم آن را فعال کردم. البته در ابتدا غیرعادی بود، اما بعد عادی شد و کار بسیار راحت تر شد.

در پاییز، اپل سیستم عامل موبایل خود را در دسترس عموم قرار خواهد داد سیستم iOS 7 با طراحی انقلابی و طیف گسترده ای از ویژگی های جدید و برنامه های کاربردی به روز. در واقع نوآوری های زیادی وجود خواهد داشت که از یک طراحی کاملاً مجدد شروع می شود ظاهرو با یک رویکرد منحصر به فرد برای استفاده به پایان می رسد. دومی همچنین شامل به اصطلاح اثر اختلاف منظر است که، همانطور که توسعه دهندگان می گویند، برای تغییر نحوه تعامل کاربران با دستگاه های تلفن همراه طراحی شده است.

اپل این فناوری را اینگونه توصیف می کند:

iOS 7 حس چند بعدی را ایجاد می کند. این سیستم عامل برای گسترش بیشتر از فناوری های iPhone، iPad و iPod touch بهره می برد قابلیت های iOS. لایه های شفاف و کاربردی محتوا را ایجاد عمق و سازماندهی می کند.

پس زمینه شفاف حس ارتباط با زمینه و مکان را می دهد. و رویکرد جدید به انیمیشن و حرکت بیشترین سود را دارد کارهای سادهبسیار هیجان انگیز تر."

به طور خلاصه، اصل فناوری به این صورت است: در یک صفحه شیشه ای تخت از گوشی که نمایشگر نامیده می شود، کاربر دنیایی سه بعدی را می بیند که همراه با دستگاه در فضا حرکت می کند.

اختلاف منظر و پرسپکتیو

اصل اثر اختلاف منظر بر این اساس است که چگونه مغز اندازه یک شی را در میدان دید شخص تعیین می کند. هر چه یک شی نزدیکتر باشد، بزرگتر به نظر می رسد. و بالعکس، هر چه یک شی از ما دورتر باشد، اندازه آن کوچکتر است.

این یک توصیف اساسی از نحوه درک مغز از چشم انداز است و اختلاف منظر تغییر در موقعیت ظاهری یک شی نسبت به یک پس زمینه دور بسته به موقعیت ناظر است. به عنوان مثال، هنگامی که شما داخل یک ماشین یا قطار سریع السیر هستید، اجسام نزدیک به شما سریعتر حرکت می کنند، در حالی که اشیاء دورتر کندتر حرکت می کنند. اگر چه در واقعیت آنها سرعت یکسانی دارند.

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

از موشک گرفته تا گوشی

که در جلوه اختلاف منظر iOSبازتولید شده توسط نرم افزار، و به طور خاص توسط فناوری که در ابتدا برای فضانوردی طراحی شده بود.

داخل هر دستگاه موبایلاپل دستگاهی به نام ژیروسکوپ MEMS دارد. این یک مکانیسم کوچک در داخل خود حمل می کند (کمتر از ضخامت موی انسان) که می تواند هنگامی که سیگنال الکتریکی به آن اعمال می شود با فرکانس مشخصی ارتعاش کند. هنگامی که تلفن هوشمند (یا تبلت) خود را در هر یک از سه جهت می چرخانید، مکانیسم داخل ژیروسکوپ در برابر تغییر جهت مطابق قانون اول نیوتن مقاومت می کند.

ژیروسکوپ که در ارتباط با سنسورهای دیگری به نام شتاب‌سنج کار می‌کند، به دستگاه اجازه می‌دهد تا تغییرات موقعیت خود را در فضا با دقت نسبتاً بالایی درک و تعیین کند.

با تخمین موقعیت اولیه دستگاه، بر اساس این واقعیت که اکثر افراد برای استفاده از آن گوشی را تا سطح چشم بالا می برند، iOS زاویه بین سطح نمایشگر گوشی و میدان دید ما را هنگام حرکت نسبت به یکدیگر تعیین می کند.

ریاضیات پشت اثر عمق بسیار ساده است. هر کاری که باید انجام دهید نرم افزار- بتوانید محتویات نمایشگر را در سطوح مختلف سازماندهی کنید و سپس این صفحات را نسبت به یکدیگر جابجا کنید. بر اساس موقعیت آنها نسبت به چشمان کاربر حرکت کنید. همه اینها منجر به تأثیر عمق می شود.

اگر ضبط WWDC 2013 را دیدید، ممکن است متوجه شده باشید که آیکون ها در iOS 7 به نظر می رسد که در بالای تصویر زمینه پس زمینه قرار دارند. و بسیار واقع بینانه به نظر می رسد. همین امر در مورد تب ها در سافاری نیز صدق می کند.

علیرغم این واقعیت که تمام ویژگی های iOS 7 هنوز از دید عموم پنهان است، احتمالاً اپل افکت اختلاف منظر را در تمام اجزای سیستم عامل جدید معرفی خواهد کرد (این همچنین می تواند توضیح دهد که چرا در اولین نسل آی پدو iPhone 3GS که فاقد ژیروسکوپ هستند در لیست دستگاه های پشتیبانی شده قرار ندارند.

نحوه عملکرد اختلاف منظر در iOS 7:

iOS 8 واکنش بسیار متفاوتی را از سوی کاربران به همراه دارد. حتی اگر چشمان خود را ببندید، به اندازه کافی عملکردهای جدید دارد که برای بسیاری کاملاً غیر ضروری است. Popular Mechanics فهرستی از ویژگی های دستگاه iOS را گردآوری کرده است که ممکن است بخواهید آنها را غیرفعال کنید. ما به شما خواهیم گفت که چگونه این کار را انجام دهید.

ورودی پیش بینی
هر کسی که تا به حال متنی کم و بیش طولانی به زبان انگلیسی با استفاده از آن نوشته است صفحه کلید جدیددر iOS 8، آنها احتمالاً از راحتی ورودی پیش بینی قدردانی کرده اند و منتظر ظاهر آن برای صفحه کلید روسی زبان هستند. با این حال، همانطور که مشخص شد، اگر رمز عبور خود را اغلب وارد کنید، صفحه کلید پیشگو ممکن است روزی آن را به صورت متن واضح به شما ارائه دهد، که تا حدودی ناامن است. به تنظیمات، سپس General، Keyboard بروید و شماره گیری پیش بینی را خاموش کنید. سایر ویژگی های آزاردهنده صفحه کلید را می توان در همان منو غیرفعال کرد.

استراق سمع کردن
ما عکس ها و اطلاعات مختلف دیگر را به طور مکرر ارسال می کنیم. چند بار برای این کار از Airdrop استفاده می کنیم؟ من شخصاً در طول مدت وجودش در iOS دو بار از آن استفاده کرده ام. آن را خاموش کنید و ممکن است به صرفه جویی در مصرف باتری کمک کند. این کار به سادگی انجام می شود. مرکز کنترل را با کشیدن انگشت به بالا از پایین باز کنید، روی Airdrop ضربه بزنید و آن را خاموش کنید.

به روز رسانی پس زمینه
به‌روزرسانی خودکار برنامه‌ها از اپ استورقطعاً یک ویژگی مفید است، اما زمانی که ما نمی‌خواهیم می‌تواند کار کند. این احتمال وجود دارد که ما نخواهیم همه برنامه ها را به روز کنیم. این نیز بر عمر باتری دستگاه تأثیر منفی می گذارد. در بخش تنظیمات "App Store" می توانید غیرفعال کنید بروزرسانی های خودکارو برنامه ها را در زمانی که برای شما راحت تر است به صورت دستی به روز کنید.

پیام های صوتی
iMessage در iOS 8 به شما این امکان را می دهد که نه تنها متن، بلکه صدای خود را نیز با مخاطب خود به اشتراک بگذارید. این پیام‌ها به‌طور خودکار حذف می‌شوند تا اطمینان حاصل شود که مکالمه شما فضای ذخیره‌سازی زیادی را در دستگاه شما اشغال نمی‌کند، اما اگر این موارد ضبط‌شده را ارزشمند می‌دانید، به سادگی زمان حذف پیام‌های صوتی را در بخش تنظیمات پیام‌ها تغییر دهید.

اختلاف منظر
متوجه حرکت آیکون ها و تصاویر پس زمینه در خانه خود شده اید صفحه نمایش آیفونچه زمانی زاویه را تغییر می دهید؟ این ویژگی در iOS 7 ظاهر شد، اما همانطور که می توانید حدس بزنید، منطقی نیست. علاوه بر این، غیرفعال کردن آن می تواند تأثیر مثبتی بر عملکرد و عمر باتری داشته باشد. اگر می‌خواهید این افکت را خاموش کنید، کاهش حرکت را در منوی Accessibility در تنظیمات عمومی روشن کنید.

خدمات مکان یابی
احتمالاً متوجه شده اید که بسیاری از برنامه ها می خواهند مکان شما را بدانند. چند نفر از آنها واقعاً از این سود می برند؟ همه چیز خوب خواهد بود، اما تعیین موقعیت جغرافیایی انرژی زیادی از باتری می گیرد، بنابراین لیست برنامه هایی که می توانند این اطلاعات را درخواست کنند باید کاهش یابد. این را می توان در منوی تنظیمات "Privacy" در بخش "Location Services" انجام داد.

به روز رسانی محتوا
نکته دیگری برای افزایش عمر باتری. با خاموش کردن بازخوانی محتوای پس‌زمینه در منوی تنظیمات عمومی برای برخی یا همه برنامه‌ها، می‌توانید به عمر طولانی‌تر آیفون خود کمک کنید. این برای برخی از برنامه های کاربردی خاص مانند فیس بوک توصیه می شود.

دست دادن
این ویژگی به شما این امکان را می دهد که یک برنامه را بر روی یک دستگاه اجرا کنید و به استفاده از آن در دستگاه دیگر ادامه دهید. Handoff بسیار مفید است و ابزار قدرتمندبرای کسانی که اکوسیستم دستگاه های اپل را انتخاب کرده اند. اما در مورد کسانی که فقط یک دستگاه مانند آیفون یا آیپد دارند چطور؟ فقط با باز کردن بخش "Handoff and suggested software" این قابلیت بی فایده را در منوی تنظیمات "General" خاموش کنید.

نور افکن
جستجوی Spotlight در iOS 8 بهبود یافته است و اکنون قادر به ارائه اطلاعات بسیار بیشتر است. با این حال، اگر مطلقاً به برخی از داده‌ها در نتایج جستجو نیاز ندارید، می‌توانید Spotlight را بر اساس نیازهای خود برای آن سفارشی کنید. جستجو در همان بخش تنظیمات "عمومی" پیکربندی شده است.

اطلاعیه
همه اعلان های برنامه های نصب شده مفید نیستند. برخی از مردم تازه شروع به خسته شدن می کنند. اعلان های غیر ضروری را می توان در قسمت تنظیمات به همین نام غیرفعال کرد. همچنین می‌توانید ویجت‌ها را در مرکز اعلان‌ها بدون خروج از آن با کلیک کردن روی دکمه ویرایش سفارشی کنید.