2

よし、ここで何が起こっているのか... UIView サブクラスがあります。これには、2 つのポイント (開始と終了)、これらの 2 つのポイント間の CGPath、および多くの UILabels が含まれます。その UIView サブクラスをサブビューとしてスクロールビューに (CATiledLayer ベースの UIView の上に) 追加すると、アプリがメモリ警告を受け取り始め、最終的にクラッシュします。ただし、ポイントとパスを含む UIView サブクラスを削除し、CATiledLayer ビューをそのままにしておくと、すべてが完全に機能し、クラッシュやメモリの警告は発生しません。

なぜこれが起こっているのかについて誰か考えがありますか? 最大幅 40px のラベルと CGPath のみを描画しているので、コンテンツ ビューはそれほど大きくても問題はないはずですが、これもかなり小さいですか?

地図アプリです

ここにいくつかのコードがあります:

 //Display the map image
 - (void)displayTiledImageNamed:(NSString *)imageName size:(CGSize)imageSize {
     self.zoomScale = 1.0;

     container = [[UIView alloc] initWithFrame:(CGRect){ CGPointZero, imageSize }];

     _zoomView = [[UIImageView alloc] initWithFrame:(CGRect){ CGPointZero, imageSize }];
     NSString *path = [NSString stringWithFormat:@"%@/%@-Small.png",[[NSBundle mainBundle] bundlePath], [imageName stringByDeletingPathExtension]];
     UIImage *zoomImage = [UIImage imageWithContentsOfFile:path];
     [_zoomView setImage:zoomImage];

     [container addSubview:_zoomView];
     [_zoomView release];

     _tilingView = [[UMTileView alloc] initWithImageName:imageName size:imageSize];
     _tilingView.frame = _zoomView.bounds;
     [_zoomView addSubview:_tilingView];
     [_tilingView release];

     [self configureForImageSize:imageSize];

     //This is the view that's causing the crash and memory warnings
     //If this view is commented out the app functions just fine
     UMMapContentView *m = [[UMMapContentView alloc] initWithFrame:CGRectMake(0,0,imageSize.width,imageSize.height) andColors:self.colors mapView:self.mapView];
    self.contentView = m;
     [container addSubview:self.contentView];
     [m release];

     [self addSubview:container];
     [container release];
 }

これは、上記の UMMapContentView ビュー内の別のサブビューである私のパス ビュー クラスです。

+ (Class)layerClass {
    return [CATiledLayer class];
}

+ (CFTimeInterval)fadeDuration {
    return 0.0;
}

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        self.userInteractionEnabled = NO;
        self.backgroundColor = [UIColor clearColor];
    }
    return self;
}

- (void)dealloc {
    self.path = nil;
    self.pathColor = nil;
    [super dealloc];
}

- (void)resetPathView {
    CATiledLayer *tiledLayer = (CATiledLayer*)self.layer;
    tiledLayer.contents = nil;
    [tiledLayer setNeedsDisplay];
}

- (void)drawPath:(UMPath*)p {
    self.path = p;
    [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect {
    if (self.path) {
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetStrokeColorWithColor(context, self.pathColor.CGColor);
        CGContextSetShadowWithColor(context, CGSizeMake(2.0, 1.0), 1.0, [[UIColor colorWithWhite:0.2 alpha:0.8] CGColor]);
        CGContextSetLineWidth(context, 8.0);
        CGContextBeginPath (context);
        CGContextMoveToPoint (context, ((UMMapPoint*)[self.path.points objectAtIndex: 0]).x, ((UMMapPoint*)[self.path.points objectAtIndex: 0]).y);
        for (int i = 1; i < self.path.points.count; i++) {
            CGContextAddQuadCurveToPoint (context, ((UMMapPoint*)[self.path.points objectAtIndex:i-1]).x, ((UMMapPoint*)[self.path.points objectAtIndex: i-1]).y, ((UMMapPoint*)[self.path.points objectAtIndex:i]).x, ((UMMapPoint*)[self.path.points objectAtIndex:i]).y);
        }
        CGContextStrokePath (context);
    }
}

これは、すべての UILabels を UMMapContentView ビューに配置する私の方法です。

- (void)mapAllLabelsInNavigationMap:(int)navigationMap {

    //There are 1109 label dictionaries in the labels array
    for (NSDictionary *dict in labels) {
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake([[dict objectForKey:@"X"] floatValue],[[dict objectForKey:@"Y"] floatValue],[[dict objectForKey:@"Width"] floatValue],[[dict objectForKey:@"Height"] floatValue])];
        [label setLineBreakMode:NSLineBreakByWordWrapping];
        [label setNumberOfLines:0];
        [label setBackgroundColor:[UIColor clearColor]];
        [label setTextColor:[self colorFromHexString:[dict objectForKey:@"Foreground"]]];
        [label setFont:[UIFont systemFontOfSize:[[dict objectForKey:@"FontSize"] floatValue]]];
        [label setTextAlignment:NSTextAlignmentCenter];
        [label setText:[[UMDataBase shared] stringForID:[[dict objectForKey:@"Texts_ID"] intValue] withLanguage:languageID]];

        [self addSubview:label];
        [localMapLabels addObject:label];
        [label release];
    }
}

どの方向に向かう必要があるのか​​ よくわかりません...どんな助けも大歓迎です!:)

4

1 に答える 1

0

のソース コードを提供していませんが、UMMapContentViewCATiledLayer を使用している場合は、それが問題になる可能性があります。CATiledLayer に基づくビューをサブビューできないようです。

一番下までスクロールします (コメント セクション内): http://red-glasses.com/index.php/tutorials/catiledlayer-how-to-use-it-how-it-works-what-it-does/

とにかく独自のタイル レイヤーを作成すると、より簡単になる場合があります。CATiledLayer に関するドキュメントはまばらですが、バグはたくさんあります。

于 2013-04-05T02:00:44.357 に答える