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)
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
Post a Comment