Oddiy UITableView-da "bo'sh" hujayralar ko'rinishini qanday o'zgartirishim mumkin?

Agar sizda bitta qatorli oddiy (guruhlanmagan) UITableView bo'lsa, ekranning qolgan qismi bo'sh yoki bo'sh katakchalar bilan to'ldiriladi. Ushbu bo'sh hujayralarning ko'rinishini qanday o'zgartirasiz? Avvaliga, men ular jadval ko'rinishida ishlatiladigan hujayraning ko'rinishiga ega bo'ladi deb o'yladim, lekin ular yo'qga o'xshaydi.

Cultured Code (Things) dagi odamlar bu hujayralarni o'zgartirish bo'yicha yaxshi ish qilishdi, lekin men ularning ko'rinishini o'zgartirish yo'lini darhol o'ylay olmayman.

Har qanday maslahat?


person Bart Jacobs    schedule 20.06.2009    source manba
comment
Bump ishlaydigan yechim topdimi? Iltimos, shu yerda baham ko'ring. rahmat   -  person lostInTransit    schedule 22.06.2009
comment
Men hozirgacha qilgan ishim - jadval ko'rinishining oxiriga "ko'rinmas" katakchani jadval ko'rinishi oxiridagi soyani ko'rsatadigan tasvir ko'rinishi bilan qo'shish. Men ajratuvchi uslubni hech kimga o'rnatdim. Bu shunga o'xshash effekt yaratadi, lekin men undan mamnun bo'lish uchun uni biroz o'zgartirishim kerak.   -  person Bart Jacobs    schedule 22.06.2009


Javoblar (8)


Garchi bu siz qidirayotgan narsa bo'lmasa-da, jadvalda pastki ko'rinishni o'rnatish orqali uni bo'sh hududni (bo'sh hujayralar o'rniga) ko'rsatish uchun ham o'zgartirishingiz mumkin. 0 balandlikdagi UIView yordam beradi.

person dmercredi    schedule 22.06.2009
comment
Sizning yordamingiz bilan men buni tushundim va bu juda oddiy. Kerakli UIImageView-ni UITableView-ning pastki qismiga qo'shing (siz taklif qilganingizdek), lekin jadval ko'rinishi to'g'ri ishlashi uchun siz uning balandligini UIImageView balandligi bilan oshirishingiz kerak. Shunday qilib, jadval ko'rinishi odatdagi jadval ko'rinishi sifatida ishlaydi, lekin siz men qidirgan yoqimli effektga egasiz. Jadval ko'rinishidagi hujayra ajratgichlarini olib tashlashni unutmang. - person Bart Jacobs; 24.06.2009
comment
Buning uchun ishlaydigan kodingiz bormi? Men bu yerda tushuntirilgan narsalarni takrorlashda qiynalmoqdaman - person Ben Clayton; 19.11.2012
comment
Mana men uchun nima ishlagan. iOS 6.1 da koʻrinish balandligini oshirish shart emasdek tuyuladi: myTableView.tableFooterView = [[[UIView alloc] initWithFrame:CGRectZero] autorelease]; - person Josh Justice; 27.01.2013
comment
Endi iOS 7/8 va men nol balandlik ko'rinishi qanday ishlashini tushunolmayapman. Bu shunchaki men uchun ko'rinmaydi. YANGILASH: Ha, aslida u ishlaydi. Agar siz nol balandlik ko'rinishini qo'shsangiz, jadval ko'rinishi bo'sh katakchani ko'rsatmaydi, faqat oq bo'shliq. Menga kerak bo'lgan narsa bu ko'rinishga biror narsa kiritishdir. Afsuski, bu ishlamayapti. - person wrtsprt; 29.07.2015

samvermette javobiga asoslanib, lekin UITableViewCell kichik sinfidagi tasvirni birlashtirish o‘rniga bevosita fon tasviridan foydalanish uchun o‘zgartirildi. Semning javobi yaxshi, lekin u to'g'ridan-to'g'ri fon tasvirini yaratishdan ko'ra kamroq samarali bo'ladi.

UIView kichik sinfini yarating -- bu misolda men uni CustomTiledView deb nomladim -- va sinfga quyidagi kodni qo'shing:

- (void)drawRect:(CGRect)rect {
UIImage *image = [UIImage imageNamed:@"tableview_empty_cell_image"];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextScaleCTM (context, 1, -1); 
CGContextDrawTiledImage(context, 
                        CGRectMake(0, 0, rect.size.width, image.size.height), 
                        [image CGImage]); 
}

Tableviewcontroller-ga quyidagi kodni qo'shing:

- (CGFloat)tableView:(UITableView *)tableView 
           heightForFooterInSection:(NSInteger)section {
    // this can be any size, but it should be 1) multiple of the 
    // background image height so the last empty cell drawn
    // is not cut off, 2) tall enough that footer cells
    // cover the entire tableview height when the tableview
    // is empty, 3) tall enough that pulling up on an empty
    // tableview does not reveal the background.
        return BACKGROUND_IMAGE_HEIGHT * 9; // create 9 empty cells
}

- (UIView *)tableView:(UITableView *)tableView 
            viewForFooterInSection:(NSInteger)section {
    CustomTiledView *footerView = [[CustomTiledView alloc] init];
    return [footerView autorelease];
}

Nihoyat, jadval ko'rinishining pastki tarkibini -tableView:heightForFooterInsection: dan qaytarilgan qiymatning salbiyiga o'rnatishingiz kerak bo'ladi, bu misolda u -1*BACKGROUND_IMAGE_HEIGHT*9 bo'ladi. Pastki tarkibni Interface Builder o'lchami inspektoridan yoki tableviewcontrollerdan self.tableView.contentInset xususiyatini o'rnatish orqali o'rnatishingiz mumkin.

Salom!

person memmons    schedule 28.03.2011

Men tableView sarlavhasi va altbilgisi ko'rinishlariga ~300px balandlikdagi UIView pastki sinfini o'rnatdim, tableView qo'shimchalarini ushbu ko'rinishlarni qoplashi uchun sozladim (yuqori va pastki qo'shimchalarni -300px ga o'rnating).

Mening UIView kichik sinfim drawRect usulini qo'llaydi, unda men bo'sh UITableViewCell ni takroran chizish uchun CGContextDrawTiledImage() dan foydalanaman:

- (void)drawRect:(CGRect)rect {

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(300, 46),NO,0.0);
    emptyCell = [[SWTableViewCell alloc] initWithFrame:CGRectZero];
    [emptyCell drawRect:CGRectMake(0, 0, 300, 46)];
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    [emptyCell release];
    UIGraphicsEndImageContext();

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextScaleCTM (context, 1, -1); // this prevents the image from getting drawn upside-down
    CGContextDrawTiledImage(context, CGRectMake(0, 0, 300, 46), [newImage CGImage]);
}

Mening vaziyatimda jadval ko'rish hujayralari balandligi 46px, shuning uchun agar men UIView pastki sinfini ushbu bo'sh hujayralardan 8 tasini o'z ichiga olishini istasam, uni 368px balandlikda qilishim kerak.

person samvermette    schedule 04.11.2010
comment
Menga bu yechim yoqadi, lekin u ba'zi tweakslardan foydalanishi mumkin. Birinchisi, menimcha, jadvalni ko'rish katakchasini faqat uni chizish uchun ajratish juda og'ir ish. Uning orqasidagi g'oya juda daho -- bo'sh hujayralar avtomatik ravishda jadval ko'rish hujayrasi dizayniga kiritilgan har qanday o'zgarishlarni aks ettiradi. Tasavvur qilishim kerakki, dizayn juda tez-tez o'zgarmaydi, shuning uchun bu umumiy yondashuvdan foydalanish uchun yaxshi imkoniyat yo'q. Aksincha, men shunchaki hujayra qanday ko'rinishda tasvir yaratib, undan foydalanardim. - person memmons; 28.03.2011
comment
Bundan tashqari, men koddagi sehrli raqamlarning muxlisi emasman. Nega ularni bu yerda ishlatishga majbur bo'lganingizni tushunaman -- siz bo'sh katakchani yuklashdanoldin kontekstli ramkani bilishingiz kerak -- lekin aslida siz o'zingizga berilgan to'g'ri o'lchamga chizishingiz kerak. - person memmons; 28.03.2011
comment
Yuqoridagilarni yodda tutgan holda, men sizning kodingizga asoslangan javobni qo'shdim, lekin u haqiqiy tableViewCell dan foydalanishdan ko'ra to'g'ridan-to'g'ri fon tasvirini oladi. Biroq, men bu javobni +1 berdim, chunki bu qiziqarli va hayotiy yondashuv deb o'ylayman. - person memmons; 28.03.2011

http://jomnius.blogspot.com/2011/03/hide-uitableview-empty-cell-separator.html Jadvalda hujayra ajratuvchi qatorlar yoʻqligini aniqlashning oson usuli:

self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

Agar sizga ajratuvchi chiziqlar kerak bo'lsa, qiyin yo'l, jadvalda ajratuvchi chiziqlar yo'qligini aniqlash va maxsus UITableViewCell-ning bir qismi sifatida hujayra ajratuvchi qatorlarni yaratishdir. Hujayraning pastki qismi, shubhasiz va juda nozik grafik tasvirdan foydalangan holda. Rasmning avtomatik o'lchamini va rejimini to'g'ri belgilashni unutmang.

Boshqa usul - bo'sh UITableView ning tableFooterView ni aniqlash:

UIView *footer =
    [[UIView alloc] initWithFrame:CGRectZero];
self.myTable.tableFooterView = footer;
[footer release];
person sonofatrus    schedule 23.04.2012

Agar siz TableView-da umuman hujayralar bo'lmaganda "bo'sh hujayralar" balandligini o'zgartirmoqchi bo'lsangiz: UITableView-ning rowHeight xususiyatini o'rnatishingiz kerak (tableView:heightForRowAtIndexPath: ilovasi bo'sh TableViews-ga ta'sir qilmaydi). Agar TableView-da hujayralar mavjud bo'lsa va siz tableView:heightForRowAtIndexPath: ni amalga oshirgan bo'lsangiz, bo'sh hujayralar uchun oxirgi satr balandligi ishlatiladi.

person Julian D.    schedule 08.12.2011
comment
Bu tableView:heightForRowAtIndexPath: nima qilishidan qat'iy nazar, barcha kataklarning balandligini o'zgartiradi. - person executor21; 15.03.2012
comment
@executor21: to'g'ri emas, tableView:heightForRowAtIndexPath: har doim rowHeight xususiyati orqali o'rnatgan qiymatni bekor qiladi, lekin u faqat kamida bitta katak bo'lsa qo'llaniladi. - person Julian D.; 15.03.2012

Ehtimol, fonni bo'sh hujayralar ko'rinishi bilan to'ldiradigan UITableView ning maxsus pastki sinfini yaratishingiz kerak bo'ladi.

- (void)drawRect:(CGRect)rect {
  [super drawRect: rect];

  // draw your background here if the rect intersects with the background area
}
person Daniel    schedule 20.06.2009

Ishonamanki, UITableView tableView:viewForFooterInSection: usulini qo'llash usuli jadval bo'sh, ya'ni kataklari bo'lmagan holatda ishlamaydi. Bunday holda, siz taklif qilingan Answerbot texnikasidan foydalanishingiz mumkin, bu esa yaratilgan UIView ni jadvalning pastki koʻrinishiga aniq kiritish uchun oʻzgartirilishi mumkin, quyidagi kabi:

    CGRect cellRect = CGRectMake(0, 0, table.bounds.size.width, table.bounds.size.height);
    CustomTiledView *footerView = [[[CustomTiledView alloc] initWithFrame:cellRect] autorelease];
    table.tableFooterView = footerView;
person MoFlo    schedule 28.10.2011

Swift 4.0 uchun:

self.tableView.tableFooterView = UIView(frame: CGRect.zero)
person ArtZen    schedule 06.08.2018