ios - UIScrollView Scrollable Content Size Size




swift autolayout (16)

أيها الزملاء devs ، أواجه مشكلة مع AutoLayout في Interface Builder (Xcode 5 / iOS 7). إنه أمر أساسي ومهم للغاية لذا أعتقد أن الجميع يجب أن يعرفوا كيف يعمل هذا بشكل صحيح. إذا كان هذا خطأ في Xcode ، فهو حرج!

لذا ، عندما يكون لدي تسلسل هرمي لواجهة العرض مثل هذا ، أواجه مشكلات:

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)

يحتوي UIScrollView على قيود صلبة ، على سبيل المثال ، 50 بيكسل من كل جانب (لا توجد مشكلة). ثم أقوم بإضافة قيد أعلى الفضاء إلى UILabel (لا توجد مشكلة) (ويمكنني حتى أن أحدد ارتفاع / عرض التسمية ، ولا تغير شيئًا ، ولكن يجب أن تكون غير ضرورية بسبب الحجم الجوهري للملصق)

تبدأ المشكلة عند إضافة قيد زائدة إلى UILabel:

على سبيل المثال ، Trailing Space إلى: Superview يساوي: 25

الآن هناك تحذيرات تحدث - وأنا لا أفهم لماذا:

أ) غموض حجم المحتوى القابل للتمرير (يوجد بالعرض Scrollable ارتفاع / ارتفاع محتوى قابل للتمرير)

B) المشاهدات غير الصحيحة (Label المتوقع: x = -67 Actual: x = 207

لقد فعلت هذا المثال البسيط في مشروع جديد تمامًا يمكنك تنزيله وأرفق لقطة شاشة. كما ترى ، تتوقع Interface Builder أن يجلس Label خارج حدود UIScrollView (المستطيل المتقطع البرتقالي). يؤدي تحديث إطار التصنيف باستخدام أداة حل المشكلات إلى نقله إلى هناك مباشرةً.

الرجاء ملاحظة: إذا قمت باستبدال UIScrollView مع UIView ، فسيكون السلوك كما هو متوقع (إطار الملصق صحيح ووفقًا للقيد). لذا يبدو أن هناك مشكلة مع UIScrollView أو أفتقد شيء مهم.

عندما أقوم بتشغيل التطبيق دون تحديث إطار Label كما هو مقترح من قبل IB فإنه يتم وضعه على ما يرام ، بالضبط حيث من المفترض أن يكون و UIScrollView قابلاً للتمرير. إذا قمت بتحديث الإطار ، يكون "العلامة" بعيدة عن الأعين ولا يتم تمرير "UIScrollView".

ساعدني أوبي وان كينوبي لماذا تخطيط غامض؟ لماذا المنظر في غير محله؟

يمكنك تحميل نموذج المشروع هنا ومحاولة إذا كان يمكنك معرفة ما يجري: https://github.com/Wirsing84/AutoLayoutProblem


عليك فقط التأكد من وجود طريقة لإنشاء سطر مستمر من القيود من أعلى إلى أسفل شريط التمرير. [-XXX]

في حالتي - عرض التمرير الأفقي - احتجت أيضاً إلى إضافة قيود العرض والارتفاع لكل طفل من عرض التمرير ، على الرغم من أن الملاحظة الفنية لـ Apple لا تخبرك بذلك.


[اختبر في XCode 7.2 و iOS 9.2]

ما تم منع أخطاء Storyboard والتحذيرات الخاصة بي كان إعداد الحجم الداخلي لعرض التمرير وعرض المحتوى (في حالتي ، عرض stackview) إلى العنصر النائب . تم العثور على هذا الإعداد في عارض الحجم في Storyboard. ويقول - وضع وقت التصميم المضمون الحجم المضمون يؤثر فقط على طريقة عرض أثناء التحرير في Interface Builder. لن يكون للعرض حجم المحتوى الداخلي هذا في وقت التشغيل.

لذا ، أعتقد أننا لن نخطئ من خلال تحديد هذا.

ملاحظة: في لوحة العمل ، قمت بتثبيت جميع حواف scrollview إلى superview وجميع حواف stackview إلى scrollview. في التعليمة البرمجية الخاصة بي ، لقد قمت بتعيين translatesAutoresizingMaskIntoConstraints كاذبة لكل من scrollview و stackview. وأنا لم أذكر حجم المحتوى. عندما ينمو stackview ديناميكيًا ، فإن القيود المحددة في لوحة العمل تضمن أن المكدس قابل للتمرير.

كان تحذيري القصص المصورة يدفعني إلى الغضب ولم أكن أرغب في تركيز الأشياء أفقياً أو عموديًا فقط لقمع الإنذار.


أعلم أنني قد أتأخر ، لكن الحل التالي يحل هذا النوع من المشاكل بدون رمز إضافي ، فقط باستخدام القصص المصورة:

بالنسبة إلى عرض المحتوى الخاص بك ، تحتاج إلى تعيين قيود للمسافات البادئة / الزائدة / العلوية / السفلية على التمرير ، ولن يؤدي ذلك إلى تغيير إطار عرض المحتوى ، كما يلي:

بالطبع تحتاج إلى إنشاء قيود إضافية لعرض المحتوى بحيث يمكن أن يعرف عرض التمرير حجم المحتوى. على سبيل المثال ضبط ارتفاع ثابت ومركز س.

أتمنى أن يساعدك هذا.


إذا كان هناك أي شخص يحصل على سلوك حيث تلاحظ شريط التمرير في المربعات اليمنى ولكن لا يتحرك المحتوى ، فإن هذه الحقيقة تستحق النظر على الأرجح:

يمكنك أيضًا استخدام القيود بين محتوى عرض التمرير والكائنات الموجودة خارج عرض التمرير لتوفير موضع ثابت لمحتوى عرض التمرير ، مما يجعل ذلك المحتوى يبدو وكأنه يطفو فوق عرض التمرير.

هذا من documentation آبل. على سبيل المثال ، إذا قمت بتثبيت رأسك / زر / Img / View الخاص بك بطريق الخطأ إلى العرض خارج منطقة التمرير (ربما رأس أو شيء فوق قائمة التمرير فقط؟) بدلاً من contentView ، فقم بتجميد المحتوى بالكاملعرضه في مكانه.


استغرقني هذا الخطأ بعض الوقت لتعقب ، في البداية حاولت تثبيت حجم ScrollView ولكن رسالة الخطأ تقول بوضوح "حجم المحتوى". لقد تأكدت من تثبيت كل ما قمت بتثبيته من الجزء العلوي من ScrollView إلى الأسفل. وبهذه الطريقة يمكن لـ ScrollView حساب ارتفاع المحتوى الخاص بها من خلال البحث عن ارتفاع كل الكائنات والقيود. هذا حل ارتفاع المحتوى الغامض ، وعرض مماثل جدا ... في البداية كان لدي معظم الأشياء X محورها في ScrollView ، ولكن اضطررت أيضا إلى تثبيت الكائنات إلى جانب ScrollView. لا أحب هذا لأنه قد يكون لدى iPhone6 ​​شاشة أوسع ، ولكنه سيزيل خطأ "عرض المحتوى الغامض".


الأشخاص الذين يعانون من uiscrollview وليس التمرير فقط قم بتعيين القيد أسفل عرض المحتوى الخاص بك مع تخطيط أسفل العرض الأخير (الذي هو داخل عرض المحتوى الخاص بك). لا تنس إزالة مركز Y القيد.

بقية جميع القيود هي نفسها كما هو موضح أعلاه. لا يهم Scrollview سوى الحصول على أقصى ارتفاع من عرض المحتوى الخاص به ، ونقوم بتعيينه كقاعدة أسفل العرض الأخير ، مما يعني أن scrollview تلقائيًا سيؤدي إلى تغيير إزاحته للمحتوى.

في حالتي ، كان العرض الأخير UILable مع عدم وجود سطور للخصائص = 0 (والتي تقوم بتعديل ارتفاعها تلقائيًا بناءً على محتواها) بحيث تزيد بشكل ديناميكي من الارتفاع القابل للإمالة ، وفي النهاية تزيد المساحة القابلة للتمرير نظرًا لأن المخطط السفلي الخاص بالمستوى يتماشى مع أسفل عرض المحتوى ، الذي يفرض التمرير لزيادة زيادة محتواه.


انظر أدناه: عرض المحتوى في التمرير الرأسي والأفقي مركزي. لديك خطأ في الغموض ، تأكد دائمًا من إضافتين إلى scrollview من عرض المحتوى الخاص بك هو 1). المسافة من الفراغ إلى الحاوية .2) المساحة الزائدة إلى القيد الذي يتم إبرازه في لقطة الشاشة ،

هذا القيد يعني في التمرير هو مقدار ما يمكنك تمريره بعد ارتفاع عرض المحتوى أو عرضه.

قد يساعدك.


باستخدام contentView (UView) كحاوية داخل UIScrollView ، التمسك بالحواف (أعلى ، أسفل ، زائدة ، رائدة) من superview (UIScrollView) و contentView يجب أن يكون عرضه وارتفاعه متساويين إلى superview. تلك هي القيود. ودعوة الأسلوب:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

حل القضايا بالنسبة لي.


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

http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/



كنت أتلقى نفس الخطأ .. لقد فعلت ما يلي

  1. عرض (Superview)
  2. ScrollView 0،0،600،600
  3. UIView داخل ScrollView: 0،0،600،600
  4. UIView يحتوي على عرض الصورة ، والتسمية

الآن إضافة الرائدة / زائدة / أعلى / أسفل ل scrollView (2) ثم UIView (3).

حدد عرض (1) وعرض (3) تعيين الطول والوزن على قدم المساواة .. حلها مشكلتي.

لقد فعلت هذا الفيديو الذي سوف يساعد:

https://www.youtube.com/watch?v=s-CPN3xZS1A


لذا ، قمت بالفرز بهذه الطريقة:

  1. داخل UIScrollView إضافة UIView (يمكننا أن نسمي ذلك contentView ) ؛

  2. في هذا contentView ، قم بتعيين contentView العلوية والسفلية واليسرى واليمنى إلى 0 (بالطبع من scrollView وهو superViewضع أيضًا محاذاة للمركز أفقيًا وعموديًا ؛

انتهى .

يمكنك الآن إضافة جميع وجهات نظرك في هذا contentView ، وسيتم تغيير حجم scrollView تلقائيًا من contentView وفقًا contentView .

تحديث:

يتم تغطية بعض الحالات الخاصة بواسطة هذا video نشره @Sergio في التعليقات أدناه.


لقد حلت هذا النوع من المشاكل لمشاهدتي باستخدام "حل مشكلات التخطيط التلقائي"> "إضافة قيود مفقودة" للعرض المحدد

القيود التالية اثنين حل مشكلتي:

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

في أي: زائدة ، أسفل هي زائدة ، أسفل UIScrollView


لقد صنعت مقطع فيديو على youTube
التمرير StackViews باستخدام Storyboard فقط في Xcode

أعتقد أن نوعين من السيناريوهات يمكن أن يظهران هنا.

وجهة النظر داخل scrollView -

  1. ليس لديه أي محتوى مضمون الحجم (على سبيل المثال UIView )
  2. يحتوي على محتوى مضمون خاص به (مثل UIStackView )

للحصول على عرض قابل للتمرير عموديا في كلتا الحالتين ، تحتاج إلى إضافة هذه القيود:

  1. 4 قيود من الأعلى ، اليسار ، الأسفل واليمين.

  2. يساوي العرض إلى scrollview (لإيقاف التمرير أفقيًا)

أنت لا تحتاج إلى أي قيود أخرى لوجهات النظر التي لها ارتفاع مضمون ذاتي.


بالنسبة إلى المشاهدات التي لا تحتوي على ارتفاع محتوى جوهري ، يجب إضافة قيود الارتفاع. سينتقل العرض فقط إذا كان قيد الارتفاع أكثر من ارتفاع التمرير.


واجهت نفس المشكلة وبعد البحث في الوثائق وعدم العثور على حل مقبول. يجب إنشاء UIView كعرض فرعي في UIScrollView كما هو موضح أدناه:

  • UIViewController
  • UIView "العرض الرئيسي"
    • UIScrollView
      • UIView 'عرض الحاويات'
        • [محتواك]

الخطوة الثانية هي جعل قيود UIScrollView. لقد فعلت ذلك مع القيود العليا ، والقاع ، والرائدة واللاحقة إلى superView لها.

التالي أضفت القيود المفروضة على حاوية UIScrollView وهنا حيث تبدأ المشكلة. عندما تضع نفس القيود (أعلى ، أسفل ، قيادة وتتبع) ، تعطي Storyboard رسالة تحذير:

"يحتوي على عرض محتوى قابل للالتباس للتمرير" و "يحتوي على ارتفاع محتوى ملتبس قابل للتمرير"

استمر مع نفس القيود أعلاه ، وأضف القيود " الارتفاع المتساوي " و " العرض المتساوي " إلى عرض الحاويات بالنسبة إلى العرض الرئيسي وليس إلى UIScrollView. بعبارة أخرى ، ترتبط قيود "عرض الحاوية" بالمرونة الفائقة لـ UIScrollView.

بعد ذلك لن يكون لديك تحذيرات في Storyboard الخاص بك ويمكنك الاستمرار في إضافة القيود للعرضات الفرعية الخاصة بك.

آمل أن يساعد هذا شخصًا ما.


يجب أن تحتوي جميع المقابلات داخل scrollview على قيود تلامس جميع حواف عرض التمرير ، كما هو موضح في الوثائق ، ويتم حساب طول وعرض طريقة العرض تلقائيًا حسب المقاييس الواردة في المقابلات الفرعية ، وهذا يعني أنك بحاجة إلى الزائدة والقيود الرئيسية للعرض والقيود العلوية والسفلية للارتفاع.





interface-builder