سؤال

وأود أن تخصيص الخلفية (وربما الحدود جدا) لجميع UITableViewCells داخل بلدي UITableView. وحتى الآن لم أكن قادرا على تخصيص هذه الأشياء، لذلك لدي مجموعة من الخلايا خلفية بيضاء وهو الافتراضي.

هل هناك طريقة للقيام بذلك مع SDK فون؟

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

المحلول

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

نصائح أخرى

وهنا هو الطريقة الأكثر فعالية لقد جئت عبر لحل هذه المشكلة، استخدم الطريقة مندوب willDisplayCell (هذا يعتني اللون الأبيض للتسمية خلفية النص، وكذلك عند استخدام cell.textLabel.text و / أو الخلية. detailTextLabel.text):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { ... }

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

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath { ... }

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

if (indexPath.row % 2)
{
    [cell setBackgroundColor:[UIColor colorWithRed:.8 green:.8 blue:1 alpha:1]];
}
else [cell setBackgroundColor:[UIColor clearColor]];

وهذا الحل يعمل بشكل جيد في بلدي ظرف ...

وهذا هو بسيط حقا، منذ OS 3.0 فقط تعيين لون خلفية الخلية في طريقة willDisplayCell. يجب أن يتم تعيين اللون في cellForRowAtIndexPath.

وهذا يعمل على كل من النمط العادي ويتم تجميعها:

والرمز:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = [UIColor redColor];
}

وP.S: هنا استخراج وثائق لwillDisplayCell:

<اقتباس فقرة>   

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

ولقد وجدت هذه المعلومات في هذا آخر من colionel . شكرا له!

والنهج الأفضل لقد وجدت حتى الآن هو وضع رؤية الخلفية للخلية وخلفية واضحة عن subviews الخلية. وبطبيعة الحال، وهذا يبدو لطيفا على الجداول مع نمط المفهرسة فقط، بغض النظر عن مع او بدون ملحقات.

وهنا عينة حيث اهث خلفية الخلية الأصفر:

UIView* backgroundView = [ [ [ UIView alloc ] initWithFrame:CGRectZero ] autorelease ];
backgroundView.backgroundColor = [ UIColor yellowColor ];
cell.backgroundView = backgroundView;
for ( UIView* view in cell.contentView.subviews ) 
{
    view.backgroundColor = [ UIColor clearColor ];
}

وببساطة هذا فيكم UITableView ملف فئة مندوب (. م):

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell  forRowAtIndexPath:(NSIndexPath *)indexPath 
{
    UIColor *color = ((indexPath.row % 2) == 0) ? [UIColor colorWithRed:255.0/255 green:255.0/255 blue:145.0/255 alpha:1] : [UIColor clearColor];
    cell.backgroundColor = color;
}

وأنا أتفق مع صبا،    حاولت أن حدد لي لون الصف بالتناوب في طريقة rowForIndexPath مندوب لكن تم الحصول على نتائج غير متناسقة بين 3.2 و 4.2. وفيما يلي عملت كبيرة بالنسبة لي.

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {

    if ((indexPath.row % 2) == 1) {
        cell.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.textLabel.backgroundColor = UIColorFromRGB(0xEDEDED);
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }
    else
    {
        cell.backgroundColor = [UIColor whiteColor];
        cell.selectionStyle = UITableViewCellSelectionStyleGray;
    }

}

وبعد تجربة كل الحلول المختلفة، والطريقة التالية هو الأكثر أناقة. تغيير لون في الأسلوب مندوب التالية:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (...){
        cell.backgroundColor = [UIColor blueColor];
    } else {
        cell.backgroundColor = [UIColor whiteColor];
    }
}

وvlado.grigorov لديه بعض النصائح الجيدة - هو أفضل وسيلة لخلق backgroundView، وتعطي هذا اللون، ووضع كل شيء آخر إلى clearColor. أيضا، وأعتقد أن الطريقة هي الطريقة الوحيدة لمسح بشكل صحيح اللون (محاولة عينة له - ولكن مجموعة 'clearColor' بدلا من 'yellowColor')، وهو ما كنت أحاول القيام به

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

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

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

ويمكنك تخصيص بالتأكيد خلية، ولكنها ليست تماما سهلا كما قد يتصور البعض في البداية.

وإنشاء طريقة عرض وتعيين هذه كما عرض خلفية الخلية

UIView *lab = [[UIView alloc] initWithFrame:cell.frame];
            [lab setBackgroundColor:[UIColor grayColor]];
            cell.backgroundView = lab;
            [lab release];

لتوسيع على إجابة N.Berendt - وإذا كنت ترغب في تعيين لون الخلية بناء على بعض الدول في كائن بيانات الخلية الفعلي، في الوقت الذي تقوم بتكوين بقية المعلومات لخلية الجدول، وهو عادة عند هي في طريقة cellForRowAtIndexPath، يمكنك القيام بذلك عن طريق تجاوز الأسلوب willDisplayCell لتعيين لون الخلفية خلية من لون الخلفية عرض المحتوى - وهذا يحصل في جميع أنحاء قضية زر الكشف عن الخلفيات وما إلى ذلك لا يكون على حق ولكن لا يزال تمكنك من التحكم في اللون في طريقة cellForRowAtIndexPath حيث كنت تفعل كل الخاص بك التخصيص خلية أخرى.

وهكذا: إذا قمت بإضافة هذا الأسلوب لعرض جدول المفوض:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    cell.backgroundColor = cell.contentView.backgroundColor;
}

وبعد ذلك في طريقة cellForRowAtIndexPath الخاص بك يمكنك القيام به:

if (myCellDataObject.hasSomeStateThatMeansItShouldShowAsBlue) {
    cell.contentView.backgroundColor = [UIColor blueColor];
}

وهذا يوفر الحاجة إلى استرداد كائنات البيانات الخاصة بك مرة أخرى في طريقة willDisplayCell ويوفر أيضا وجود اثنين من الأماكن التي لا الخياطة / التخصيص من خلايا الجدول الخاص بك - كل التخصيص يمكن أن يذهب في طريقة cellForRowAtIndexPath

وإنشاء صورة لاستخدامها كخلفية مع فوتوشوب أو أعرج وتسميته myimage. ثم، تضاف هذه الطريقة لدرجة tableViewController الخاص بك:

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    UIImage *cellImage = [UIImage imageNamed:@"myimage.png"];//myimage is a 20x50 px with  gradient  color created with gimp
    UIImageView *cellView = [[UIImageView alloc] initWithImage:cellImage];
    cellView.contentMode = UIContentViewModeScaleToFill;
    cell.backgroundView = cellView;
    //set the background label to clear
    cell.titleLabel.backgroundColor= [UIColor clearColor];
}

وهذا ستعمل أيضا إذا قمت بضبط UITableView للعرف في مفتش السمة.

وبلدي الحل هو إضافة التعليمات البرمجية التالية إلى الحدث cellForRowAtIndexPath:

UIView *solidColor = [cell viewWithTag:100];
if (!solidColor) {

    solidColor = [[UIView alloc] initWithFrame:cell.bounds];
    solidColor.tag = 100; //Big tag to access the view afterwards
    [cell addSubview:solidColor];
    [cell sendSubviewToBack:solidColor];
    [solidColor release];
}
solidColor.backgroundColor = [UIColor colorWithRed:254.0/255.0
                                             green:233.0/255.0
                                              blue:233.0/255.0
                                             alpha:1.0];

ويعمل تحت أي ظرف من الظروف، حتى مع أزرار الكشف، وخير المنطق الخاص للعمل على الخلايا الدولة اللون في cellForRowAtIndexPath مما كانت عليه في الحدث cellWillShow على ما أعتقد.

والفئة الفرعية UITableViewCell وإضافة هذا في التنفيذ:

-(void)layoutSubviews
{
    [super layoutSubviews];
    self.backgroundColor = [UIColor blueColor];
}
    UIView *bg = [[UIView alloc] initWithFrame:cell.frame];
    bg.backgroundColor = [UIColor colorWithRed:175.0/255.0 green:220.0/255.0 blue:186.0/255.0 alpha:1]; 
    cell.backgroundView = bg;
    [bg release];

وهذا سيعمل في أحدث كسكودي.

-(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
    cell.backgroundColor = [UIColor grayColor];
}

وجرب هذا:

- (void)tableView:(UITableView *)tableView1 willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
    [cell setBackgroundColor:[UIColor clearColor]];
    tableView1.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed: @"Cream.jpg"]];
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top