0

UIViewドロップ シャドウとコーナーを含むがあり、そのうちの 4 つをロードUIViewControllerしていますが、画面のロード時にパフォーマンスが低下しています。影と角の半径で同じ白い背景を使用しているのでUIViewNSCache.

UIViewアプリを実行すると、最初にあるはずの場所に大きなギャップがありますが、表示されません。表示されるのは、ビューのリストの最後のビューです。最後の 1 つをコメントアウトして再度実行すると、3 つ目が表示されます。メモリ内のポインターに問題があるようですが、よくわかりません。おそらく私は NSCache を間違って使用していますか?

(注: 表示されている最初のビューは NSCache を使用していません)

ここに画像の説明を入力

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];
}
4

1 に答える 1

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);
}

それは決して完璧なコードではありません。しかし、うまくいけば、これを実装するためのより良い方法のアイデアが得られるでしょう.

于 2013-05-21T17:18:20.793 に答える