تخصيص UIWebView لملفات PDF في Swift

تعد UIWebViews طريقة سهلة لعرض محتوى الويب في تطبيق iOS. إنها مفيدة بشكل خاص لعرض ملفات PDF المخزنة عن بُعد. تعامل Apple إلى حد كبير UIWebViews مثل الصندوق الأسود: تحذر الوثائق من أنه لا ينبغي تصنيفها ضمن الفئات الفرعية. إذن ماذا لو كنت تريد تخصيص طريقة عرض ملفات PDF؟ مؤخرًا ، أجريت عمليتي تخصيص لتغيير سلوك UIWebView الافتراضي.

كلاهما يتطلب بعض الإصلاح ، لذا فأنا أشاركهما في حال احتاج الآخرون إلى فعل شيء مماثل.

تخصيص كيفية تحجيم ملف PDF

السلوك الافتراضي

هناك خاصية لـ n في UIWebView تسمى scalesPageToFit. إذا قمت بضبطه على true ، فسيبدأ ملف PDF بحجمه بحيث يملأ عرضه عرض العرض. يمكنك ضبطه على صحيح في التعليمات البرمجية الخاصة بك أو في UIBuilder. وبمجرد إخراجك من الصندوق ، يمكنك التصغير والتكبير. إنه رائع!

السلوك المرغوب

حسنًا ، إنه لأمر رائع أن يكون لديك ملف PDF طويل ونحيف وتريد أن يظهر ملف PDF بالكامل عندما يصل المستخدم إلى هذا العرض. في UIViews أخرى ، يمكنك تعيين خاصية contentMode على AspectToFit للقيام بذلك. ومع ذلك ، فإن UIWebView يحتوي في الواقع على طبقتين في التسلسل الهرمي للعرض بينه وبين ملف PDF الذي نقوم بتوسيع نطاقه.

الحل

بعد الكثير من البحث في العروض الفرعية لـ UIWebView و UIBuilder و StackOverflow ، انتهيت من كتابة وظيفة صغيرة لتوسيع نطاق ملف PDF بحيث يكون ملف PDF بأكمله مرئيًا إذا كان طويلاً جدًا ونحيف ليلائم التكبير الافتراضي scalePageToFit . ها هو:

كل ما يفعله هذا هو التحقق مما إذا كان العرض أطول من اللازم مقارنة بحجم محتوى العرض. إذا كانت عريضة جدًا ، فليس علينا فعل أي شيء لأن خاصية scalePageToFit تهتم بطريقة سحرية بهذا الموقف. إذا كان الطول مفرطًا ، فسنجد نسبة ارتفاع العرض إلى المحتوى (ويعرف أيضًا باسم ملف PDF الذي يهمني). ثم يتم تعيين هذه النسبة إلى zoomScale . هذا zoomRangeFactor هو رقم سحري يمكنك اللعب به. يجب أن يكون أكبر من واحد للسماح للمستخدم بالقرص والتكبير / التصغير.

لكي يعمل هذا ، يجب استدعاء updateZoomToAspectToFit من webViewDidFinishLoad (webView: UIWebView) رد الاتصال. لكي يتم استدعاء webViewDidFinishLoad ، يجب أن يكون UIWebView هو المفوض: myWebView.delegate = self

إخفاء الظل المسقط

السلوك الافتراضي

لقد فوجئت برؤية أن هناك ظلًا يسقط حول ملف PDF في UIWebView خارج الصندوق.

السلوك المرغوب

المصمم الذي كنت أعمل معه لم يكن مندهشًا فحسب ، بل كان مستاءًا أيضًا. لذا كانت مهمتي التخلص من الظل المسقط. لقد قمت بالعبث في UIBuilder دون جدوى. لقد قمت بتشريح التسلسل الهرمي للعرض في وضع التصحيح. كانت اقتراحات StackOverflow مليئة بالشفرة التي تندرج تحت وثائق Apple ويمكن أن تتوقف مع أصغر تحديث.

الحل

قصة قصيرة طويلة ، وجدت أنه يمكنني قانونيًا (وفقًا لوثائق Apple) اجتياز العروض الفرعية لـ UIWebView وتعيين سمة shadowOpacity عليها جميعًا:

مثل updateZoomToAspectToFit ، لكي يعمل هذا ، يجب استدعاء removeShadow من رد الاتصال webViewDidFinishLoad (webView: UIWebView) . وذلك لأن العروض الفرعية لن تكون متاحة إلا بعد تحميل ملف PDF. لكي يتم استدعاء webViewDidFinishLoad ، يجب أن يكون UIWebView هو المفوض الخاص به: myWebView.delegate = self .

الصورة الأكبر

أدى التعرف على هذين التخصيصين إلى تحسين طلاقي في استخدام UIKit لنظام التشغيل iOS. لقد استمتعت بالتحدي المتمثل في معرفة كيفية الذهاب تحت غطاء المحرك مباشرة ولكن لا أقوم باختراقه بشكل سيء لدرجة أنه يصبح هشًا وعرضة لاختراق التحديثات بصمت. هذا ما أحبه في صنع البرامج في Atomic – يمكننا قضاء الوقت في القيام بالأشياء بشكل صحيح ومشاركتها عندما نكتشف كيفية إنجاز شيء ما.

تم النشر في الأصل على spin.atomicobject.com في 24 أكتوبر 2016.