2010-04-29 4 views
1

я в настоящее время имеющий следующую проблему с CATiledLayer: когда просмотр первой загрузке, прокрутка работает отлично, но потом, когда вы увеличиваете один раз, вид привязывается к точке крепления (верхний левый угол), и он больше не может прокручивать все. Масштабирование работает так, что оно будет увеличиваться и уменьшаться, но оно будет приближаться только к верхнему левому углу.Почему мой CATiledLayer не прокручивается в UIScrollView после масштабирования?

Мой код выглядит следующим образом:

#import <QuartzCore/QuartzCore.h> 
#import "PracticeViewController.h" 

@implementation practiceViewController 
//@synthesize image; 

- (void)viewDidLoad 
{ 


    NSString *path = [[NSBundle mainBundle] pathForResource:@"H-5" ofType:@"jpg"]; 
    NSData *data = [NSData dataWithContentsOfFile:path]; 
    image = [UIImage imageWithData:data]; 

    CGRect pageRect = CGRectMake(0, 0, image.size.width, image.size.height); 


    CATiledLayer *tiledLayer = [CATiledLayer layer]; 
    tiledLayer.anchorPoint = CGPointMake(0.0f, 1.0f); 
    tiledLayer.delegate = self; 
    tiledLayer.tileSize = CGSizeMake(1000, 1000); 
    tiledLayer.levelsOfDetail = 6; 
    tiledLayer.levelsOfDetailBias = 0; 
    tiledLayer.bounds = pageRect; 
    tiledLayer.transform = CATransform3DMakeScale(1.0f, -1.0f, 0.3f); 

    myContentView = [[UIView alloc] initWithFrame:self.view.bounds]; 
    [myContentView.layer addSublayer:tiledLayer]; 

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; 
    scrollView.delegate = self; 
    scrollView.contentSize = pageRect.size; 
    scrollView.minimumZoomScale = .2; 
    scrollView.maximumZoomScale = 1; 
    [scrollView addSubview:myContentView]; 
    [self.view addSubview:scrollView]; 


} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return myContentView; 
} 

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"H-5" ofType:@"jpg"]; 
    NSData *data = [NSData dataWithContentsOfFile:path]; 
    image = [UIImage imageWithData:data]; 

    CGRect imageRect = CGRectMake (0.0, 0.0, image.size.width, image.size.height); 
    CGContextDrawImage (ctx, imageRect, [image CGImage]); 
} 

@end 
+1

Stack Overflow не предназначен для использования для выполнения проверки кода. Если у вас есть особые проблемы, задайте вопросы, связанные с ними. –

+0

У меня есть конкретная проблема, которую я описал ниже в ответе Люциуса. «Хорошо, я обновил свой код, чтобы отразить то, что я прямо сейчас, действительно, есть только одна проблемы сейчас. Когда просмотр первая загрузка, прокрутка работает отлично. Но тогда, когда вы увеличиваете один раз, вид привязывается к точке крепления (верх левый угол), и он больше не может прокручиваться. Масштабирование работает в том, что оно будет увеличиваться и уменьшаться, но оно будет увеличиваться только в верхнем левом углу. "Не уверен, что вы жалуетесь на – Brodie

+0

4598 - в вашем вопросе, и разбор комментариев, чтобы выяснить, что было задано, не очень просто. Я отредактировал ваш вопрос, чтобы отразить то, что вы сейчас задаете. –

ответ

0

Вот мой первый проход при фиксации очевидных ошибок:

#import <QuartzCore/QuartzCore.h> 
#import "PracticeViewController.h" 

@implementation PracticeViewController 
@synthesize image; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    // You do not need to and must not autorelease [NSBundle mainBundle] 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"H-5" ofType:@"jpg"]; 
    NSData *data = [NSData dataWithContentsOfFile:path]; 
    image = [UIImage imageWithData:data]; 

    CGRect pageRect = CGRectMake(0, 0, 1600, 2400); 

    CATiledLayer *tiledLayer = [CATiledLayer layer]; 
    tiledLayer.delegate = self; 
    tiledLayer.tileSize = CGSizeMake(1024.0, 1024.0); 
    tiledLayer.levelsOfDetail = 5; // was 1000, which makes no sense. Each level of detail is a power of 2. 
    tiledLayer.levelsOfDetailBias = 0; // was 1000, which also makes no sense. 
    // Do not change the tiledLayer.frame. 
    tiledLayer.bounds = pageRect; // I think you meant bounds instead of frame. 
    // Flip the image vertically. 
    tiledLayer.transform = CATransform3DMakeScale(zoom, -zoom, 1.0f); 

    myContentView = [[UIView alloc] initWithFrame:self.view.bounds]; 
    [myContentView.layer addSublayer:tiledLayer]; 

    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; 
    scrollView.delegate = self; 
    scrollView.contentSize = pageRect.size; 
    scrollView.maximumZoomScale = 32; // = 2^5 
    [scrollView addSubview:myContentView]; 

    [self.view addSubview:scrollView]; 
} 

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView 
{ 
    return myContentView; 
} 

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx 
{ 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"H-5" ofType:@"jpg"]; 
    NSData *data = [NSData dataWithContentsOfFile:path]; 
    image = [UIImage imageWithData:data]; 
    CGRect imageRect = CGRectMake (0.0, 0.0, image.size.width, image.size.height); 
    CGContextDrawImage (context, imageRect, [image CGImage]); 
} 

@end 
+0

Большое спасибо - смотрите мое редактирование выше. Теперь представление загружается с изображением, но прокрутка и масштабирование не работают. Когда я увеличиваю или уменьшаю масштаб изображения, он автоматически прокручивает вид, так что определенная точка (возможно, центр изображения, но не уверен) находится в верхнем левом углу. Кроме того, плитка загружается медленнее, чем я надеялся (около 2 секунд на плитку), что о нормальном? – Brodie

+0

также - прокрутка будет работать нормально до тех пор, пока я не попытаюсь увеличить масштаб, и как только я увеличу или уменьшу масштаб, прокрутка не будет работать вообще – Brodie

+0

Используйте image.size, чтобы получить размер изображения. Плитка загружается очень медленно, потому что она должна декомпрессировать JPG для каждой плитки так, как теперь написан код. Вы должны либо хранить весь UIImage в памяти, либо нарисовать это, либо нарезать его на плитки, что я и делаю в своем приложении для iPhone Transit Maps. Масштабирование основано на файле tiledLayer.anchorPoint, который варьируется от 0.0 до 1.0 для каждой оси. Вам нужно установить для точки привязки значение {0.5.0.5}, чтобы оно увеличивалось с центра. Вам также необходимо установить tileLayer.position в центр экрана. – lucius

Смежные вопросы