iphone - UIView in NSCache being overriden -


i have uiview contains drop shadows , corners loading 4 of in uiviewcontroller , seeing performance hit when screen loads. since using same white background shadows , corner radii figured store uiview in nscache.

when run app there large gap first uiview should be, however, not showing up. show last view in list of views. if comment out last 1 , run again, third 1 shows up. seems having issue pointer in memory not sure. perhaps using nscache incorrectly?

(note: first view shown not using nscache)

enter image description here

here how using nscache:

.h file

@interface lunchdetailviewcontroller : uiviewcontroller <uiscrollviewdelegate>  @property (nonatomic) iboutlet uiscrollview *scrollview; @property (nonatomic, strong) nscache *entreeviewscache;  @end 

.m file

@synthesize scrollview; @synthesize entreeviewscache;  - (void)viewdidload {     [super viewdidload];      self.entreeviewscache = [[nscache alloc] init];     uiview *entreeview = [[uiview alloc] init];     entreeview.backgroundcolor = [uicolor whitecolor];     entreeview.layer.maskstobounds = no;     entreeview.layer.cornerradius = 3.0;     entreeview.layer.shadowoffset = cgsizemake(1.1, 2.1);     entreeview.layer.shadowopacity = 0.2;      [self.entreeviewscache setobject:entreeview forkey:@"entreeview"]; }  - (void) configurescrollview {     // line of code allows scroll view 'scrollable'.     self.scrollview.contentsize = cgsizemake(320, 620);      uiview *elementaryroundedcornerview = [self.entreeviewscache objectforkey:@"entreeview"];     elementaryroundedcornerview.frame = cgrectmake(15,15,290,180);      uiview *middleroundedcornerview = [self.entreeviewscache objectforkey:@"entreeview"];     middleroundedcornerview.frame = cgrectmake(15,210,290,180);      uiview *highroundedcornerview = [self.entreeviewscache objectforkey:@"entreeview"];     highroundedcornerview.frame = cgrectmake(15,404,290,180);      nsmutablearray *entreeitems = [[nsmutablearray alloc] initwithobjects:@"pancakes w/ sausage patties", @"corn dog", @"grilled cheese sandwhich", @"chicken tender wraps", nil];       uiview *elementarylunchmenudetails = [[uiview alloc] initwithframe:cgrectmake(10, 10, 240, 160)];     [elementarylunchmenudetails addsubview:[self returnnativecode:entreeitems rectdimensions:cgrectmake(2, 5, 215, 160) schooltype:@"elementary"]];     [elementaryroundedcornerview addsubview:elementarylunchmenudetails];      uiview *middlelunchmenudetails = [[uiview alloc] initwithframe:cgrectmake(10, 10, 240, 160)];     [middlelunchmenudetails addsubview:[self returnnativecode:entreeitems rectdimensions:cgrectmake(2, 2, 215, 160) schooltype:@"middle"]];     [middleroundedcornerview addsubview:middlelunchmenudetails];      uiview *highlunchmenudetails = [[uiview alloc] initwithframe:cgrectmake(10,10, 240, 160)];     [highlunchmenudetails addsubview:[self returnnativecode:entreeitems rectdimensions:cgrectmake(2, 2, 215, 160) schooltype:@"high"]];     [highroundedcornerview addsubview:highlunchmenudetails];      [self.scrollview addsubview:elementaryroundedcornerview];     [self.scrollview addsubview:middleroundedcornerview];     [self.scrollview addsubview:highroundedcornerview]; } 

wow. that's clever. not correct.

instead of using nscache duplicate view, want create uiview subclass formats view way want. throw bunch of views on scrollview.

abcview.m

@implementation abcdayview  - (id)initwithframe:(cgrect)frame {     self = [super initwithframe:frame];     if (self) {         self.backgroundcolor = [uicolor whitecolor];         self.layer.maskstobounds = no;         self.layer.cornerradius = 3.0;         self.layer.shadowoffset = cgsizemake(1.1f, 2.1f);         self.layer.shadowopacity = 0.2f;     }     return self; }  - (void)setitems:(nsarray *)items {     if ([_items isequaltoarray:items] == no) {         _items = items;         [self createitemviews];         [self setneedslayout];     } }  // you'll need add -createitemviews , -setneedslayout methods. 

.m file

- (void)configurescrollview {     nsmutablearray *entreeitems = @[@"pancakes w/sausage patties",                                     @"corn dog",                                     @"grilled cheese sandwhich",                                     @"chicken tender wraps"];      cgrect frame = cgrectmake(15,15,290,180);     abcdayview *elementaryview = [[abcdayview alloc] initwithframe:frame];     elementaryview.items = entreeitems;      cgfloat y = cgrectgetmaxy(elementaryview.frame) + 10.0f;     frame = cgrectmake(15, y, 290, 180);     abcdayview *middleview = [[abcdayview alloc] initwithframe:frame];     middleview.items = entreeitems;      ...      cgfloat length = // use cgrectgetmaxy on last frame length.     self.scrollview.contentsize = cgsizemake(320, length); } 

that's no means perfect code. give idea of better way implement this.


Comments

Popular posts from this blog

blackberry 10 - how to add multiple markers on the google map just by url? -

php - guestbook returning database data to flash -

java - Using an Integer ArrayList in Android -