2013-05-21 3 views
0

UIView에는 내 그림자 섀도우와 모서리가 포함되어 있으며이 중 네 개는 내 UIViewController에로드되며 화면이로드 될 때 성능이 저하됩니다. 그림자와 모서리 반경이 같은 흰색 배경을 사용하기 때문에 UIViewNSCache에 저장합니다.NSCache의 UIView가 재정의됩니다

앱을 실행할 때 첫 번째 UIView이 표시되어야하는 큰 차이가 있습니다. 내 뷰 목록의 마지막 뷰가 표시됩니다. 내가 마지막 것을 주석으로 달아서 다시 실행하면, 세 번째 것이 나타납니다. 메모리에있는 포인터에 문제가있는 것 같지만 확실하지 않습니다. 아마도 NSCache를 잘못 사용하고 있습니까?

(참고 : NSCache를 사용하지 않는 표시된 첫 번째보기) 여기

enter image description here

은 내가 사용하는 방법 NSCache입니다 :

.H 파일

@interface LunchDetailViewController : UIViewController <UIScrollViewDelegate> 

@property (nonatomic) IBOutlet UIScrollView *scrollView; 
@property (nonatomic, strong) NSCache *entreeViewsCache; 

@end 

.m 파일

@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 
{ 
    // This line of code allows the scroll view to be '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]; 
} 

답변

0

와우. 영리합니다. 그러나 정확하지 않습니다.

NSCache를 사용하여보기를 복제하는 대신 원하는 방식으로보기의 서식을 지정하는 UIView 하위 클래스를 만들려고합니다. 그런 다음 해당 스크롤 뷰를 스크롤 뷰에 던지십시오.

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 also need to add -createItemViews and -setNeedsLayout methods. 

하는 .m 파일

- (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 the last frame to get the length. 
    self.scrollView.contentSize = CGSizeMake(320, length); 
} 

. 그러나 잘하면이 구현할 수있는 더 좋은 방법에 대한 아이디어를 줄 것이다.

관련 문제