سؤال

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

سيناريو
ما أحاول القيام به هو إنشاء طريقة عرض تحتوي على بعض التصنيفات وزر.تحتوي وحدة التحكم في العرض على خاصية الصعوبة بناءً على ذلك، حيث سيكون لها نص مختلف في التسميات/كمية التسميات.
أي.سهل - 3 ملصقات
صعب - 4 ملصقات

أقوم بإنشاء العرض الخافت والتنبيه (المصمم) على النحو التالي:

// Setup the dimmedView
UIView *dimmedView = [[UIView alloc] initWithFrame:self.view.frame];
dimmedView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.6];

// Setup the startingAlertView
UIView *startingAlertView = [[UIView alloc] init];
startingAlertView.backgroundColor = [UIColor whiteColor];

أقوم بعد ذلك بإنشاء التسميات الثلاثة/الأربعة بناءً على بعض المنطق وأضف التسميات الضرورية إلى ملف startingAlertView على أساس المنطق أيضا.

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

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

هل كانت مفيدة؟

المحلول

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

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

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

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

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

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

نصائح أخرى

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

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

يمكنك أيضًا الانتظار حتى تقوم بإضافة كافة التسميات التي تريدها، ثم قم بتعيين الارتفاع على الموضع y للتسمية السفلية بالإضافة إلى ارتفاعها بالإضافة إلى المساحة السفلية التي تريدها حول التسميات.

نعم، باستخدام التخطيط التلقائي يمكنك الحصول على الحدود من العرض الأصلي.

فيما يلي مثال سريع، لاحظ أننا لا نستخدم الإطار، ونستخدم CGRectZero لـ UILabels الخاصة بنا، ويأتي تحديد الموضع من updateConstraints بدلاً من.انا استخدم لغة التنسيق المرئي لتخطيط التسميات التي أوصي بها إذا كنت تفعل ذلك برمجيًا.

نحن هنا نصنع التسميات بعرض العرض الأصلي ثم نجمعها فوق بعضها البعض.

#import "View.h"

@implementation View{
    UILabel *_label1;
    UILabel *_label2;
    UILabel *_label3;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        _label1 = [[UILabel alloc] initWithFrame:CGRectZero];
        _label1.translatesAutoresizingMaskIntoConstraints = NO;
        _label1.text = @"LABEL 1";

        _label2 = [[UILabel alloc] initWithFrame:CGRectZero];
        _label2.translatesAutoresizingMaskIntoConstraints = NO;
        _label2.text = @"LABEL 2";

        _label3 = [[UILabel alloc] initWithFrame:CGRectZero];
        _label3.translatesAutoresizingMaskIntoConstraints = NO;
        _label3.text = @"LABEL 3";

        [self addSubview:_label1];
        [self addSubview:_label2];
        [self addSubview:_label3];
    }


    [self updateConstraintsIfNeeded];

    return self;
}

-(void)updateConstraints
{
    [super updateConstraints];

    NSDictionary *_viewsDictionary = NSDictionaryOfVariableBindings(_label1,_label2,_label3);


    // Set the contraintsto span the entire width of the super view
    NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label1]-|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:_viewsDictionary];

    [self addConstraints:constraints];

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label2]-|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:_viewsDictionary];
    [self addConstraints:constraints];

    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[_label3]-|"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:_viewsDictionary];

    [self addConstraints:constraints];


    // Last setup the vertical contraints other wise they will end up in a random place
    constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[_label1]-[_label2]-[_label3]"
                                                                   options:0
                                                                   metrics:nil
                                                                     views:_viewsDictionary];
    [self addConstraints:constraints];
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

@end
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top