iphone - iOS: متعدد UILabel في تخطيط تلقائي





cocoa-touch autolayout (8)


طريقة واحدة للقيام بذلك ... كلما زاد طول النص ، حاول تغيير (تقليل) الخطوط في نص التسمية باستخدام

Label.adjustsFontSizeToFitWidth = YES;

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

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

كيف يمكنني الحصول على تصنيف العنوان لتغيير حجمه ليناسب عدد السطور المطلوبة بواسطة السلسلة؟ ما أفهمه هو أنه لا يمكنني استخدام أساليب setFrame لأنني أستخدم Auto Layout. ولا بد لي من استخدام Auto Layout لأنني أحتاج إلى تلك المشاهدات الأخرى للبقاء دون تسمية العنوان (ومن هنا تأتي القيود).

كيف يمكنني جعل هذا يحدث؟




لدي UITableViewCell الذي يحتوي على تسمية التفاف النص. عملت التفاف النص على النحو التالي.

1) ضع قيود UILabel كالتالي.

2) تعيين لا. من الخطوط إلى 0.

3) يضاف ارتفاع UILabel إلى UITableViewCell.

@IBOutlet weak var priorityLabelWidth: NSLayoutConstraint!

4) على UITableViewCell:

priorityLabel.sizeToFit()
priorityLabelWidth.constant = priorityLabel.intrinsicContentSize().width+5



قم بتوسيع رقم مجموعة التسميات الخاص بك إلى 0 ، وكذلك الأهم من ذلك بالنسبة لضبط مجموعة التخطيط التلقائي إلى> = x. التخطيط التلقائي سوف يقوم بالباقي. قد تحتوي أيضًا على العناصر الأخرى الخاصة بك استنادًا إلى العنصر السابق لتحديد موضعها بشكل صحيح.




لم يعمل أي من الحلول المختلفة التي تم العثور عليها في العديد من الموضوعات حول هذا الموضوع بشكل مثالي لحالتي (x التسميات متعددة الأسطر الديناميكية في خلايا عرض الجدول الديناميكي).

لقد وجدت طريقة للقيام بذلك:

بعد تعيين القيود على التسمية وتعيين الخاصية المتعددة الأسطر الخاصة به إلى 0 ، إنشاء فئة فرعية من UILabel؛ اتصلت بالألغام AutoLayoutLabel:

@implementation AutoLayoutLabel

- (void)layoutSubviews{
    [self setNeedsUpdateConstraints];
    [super layoutSubviews];
    self.preferredMaxLayoutWidth = CGRectGetWidth(self.bounds);
}

@end



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

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

طريقة سهلة لمعرفة ما إذا كانت هذه هي الحالة من خلال محاولة تغيير حجم التسمية يدويًا. هل يسمح لك IB بتطويره؟ إذا حدث ذلك ، فهل تتحرك العلامات أدناه كما تتوقع؟ تأكد من التحقق من كلاهما قبل تغيير حجمك لترى كيف ستحرك قيودك وجهات نظرك:

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




أجد أنك تحتاج إلى ما يلي:

  • القيد العلوي
  • القيد الرئيسي (على سبيل المثال ، الجانب الأيسر)
  • قيد لاحق (على سبيل المثال ، الجانب الأيمن)
  • عيّن المحتوى الذي يعانق الأولوية ، أفقياً إلى منخفضاً ، بحيث تملأ المساحة المعطاة إذا كان النص قصيرًا.
  • قم بضبط مقاومة ضغط المحتوى ، من المستوى الأفقي إلى المنخفض ، حتى يتم التفافها بدلاً من محاولة توسيع نطاقها.
  • اضبط عدد الأسطر على 0.
  • اضبط وضع فاصل الأسطر على التفاف الكلمات.



المصدر: http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html

حجم المحتوى الداخلي للنص متعدد الخطوط

حجم المحتوى الداخلي UILabel و NSTextField مبهم للنص متعدد الأسطر. يعتمد ارتفاع النص على عرض الخطوط ، والذي لم يتحدد بعد عند حل القيود. لحل هذه المشكلة ، يكون لكل من الصفوف خاصية جديدة تسمى preferredMaxLayoutWidth ، والتي تحدد الحد الأقصى لعرض الخط لحساب حجم المحتوى الداخلي.

بما أننا عادة لا نعلم هذه القيمة مقدمًا ، فنحن بحاجة إلى اتباع منهج من خطوتين للحصول على هذا الحق. أولاً ، نسمح لـ Auto Layout أن تقوم بعملها ، ثم نستخدم الإطار الناتج في مسار التخطيط لتحديث العرض الأقصى المفضل وتخطيط التشغيل مرة أخرى.

- (void)layoutSubviews
{
    [super layoutSubviews];
    myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
    [super layoutSubviews];
}

تعد الدعوة الأولى إلى [super layoutSubviews] ضرورية لكي تحصل التسمية على مجموعة الإطارات الخاصة بها ، بينما تكون الدعوة الثانية ضرورية لتحديث التخطيط بعد التغيير. إذا حذفت المكالمة الثانية ، فسنحصل على خطأ NSInternalInconsistencyException ، لأننا أجرينا تغييرات في مسار التخطيط والتي تتطلب تحديث القيود ، ولكننا لم نقم بتشغيل التخطيط مرة أخرى.

يمكننا أيضًا القيام بذلك في فئة فرعية لنفسها:

@implementation MyLabel
- (void)layoutSubviews
{
    self.preferredMaxLayoutWidth = self.frame.size.width;
    [super layoutSubviews];
}
@end

في هذه الحالة ، لا نحتاج إلى الاتصال [super layoutSubviews] أولاً ، لأنه عندما يتم الاتصال بالتطبيق "بانوراميات" ، يكون لدينا بالفعل إطار على العلامة نفسها.

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

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    myLabel.preferredMaxLayoutWidth = myLabel.frame.size.width;
    [self.view layoutIfNeeded];
}

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




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







iphone ios cocoa-touch autolayout