2013-08-13 11 views
0

Мое приложение:
У меня теперь есть приложение, отображающее динамическое изображение. И я хочу записать его текущее изображение и сохранить его на диске.Анимация и удаление объекта NSImageView не удалось?

Моя цель:
Я работаю на анимированный визуальный эффект: добавить вид изображения на вершине, а затем оживляет его от происхождения кадра в CGRecrZero. Наконец, удалите этот вид изображения из иерархии vie после завершения анимации.


Теперь проблема:
Первый раз triggerring действие, кажется, работа. Но когда вы запускаете его во второй раз, изображение не оживляет и не остается на вершине всех подзонов.


Коды контроллера представления (с ARC):

Во-первых, это IBAction для запуска снимка:

- (IBAction)actionSaveSnapshot:(id)sender 
{ 
    ... // Save the image file. This works everytime. 

    NSThread *tempThread = [[NSThread alloc] initWithTarget:self 
                selector:@selector(threadSimulateScreenCapture:) 
                object:nil]; 
    if (tempThread) 
    { 
     [tempThread start]; 
     tempThread = nil;  // Simply release it 
    } 
} 

А вот нить:

- (void)threadSimulateScreenCapture:(id)arg 
{@autoreleasepool { 
    NSImageView __strong *subImageView; 
    subImageView = [[NSImageView alloc] init]; 
    NSRect subRect = [_imageView frame]; // the dynamic image view which I want to snapshot with 
    const CGFloat animationTime = 0.4; 

    [subImageView setWantsLayer:YES]; 
    [subImageView setImageScaling:NSImageScaleAxesIndependently]; 
    [subImageView setImage:[_imageView image]]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [CATransaction begin]; 
     [self.view addSubview:subImageView]; 
     [subImageView setFrame:subRect]; 
     [subImageView setNeedsDisplay:YES]; 
     [CATransaction commit]; 
    }); 

    [NSThread sleepForTimeInterval:0.01]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [CATransaction begin]; 
     [CATransaction setAnimationDuration:animationTime]; 
     [subImageView.layer setFrame:CGRectZero]; 
     [CATransaction commit]; 
    }); 

    [NSThread sleepForTimeInterval:(NSTimeInterval)animationTime]; // wait for end of animation 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [subImageView removeFromSuperview]; 
    }); 

    NSLog(@"SubView Count: %@\n%@", self.view.subviews, subImageView); // MARK. described below 
    subImageView = nil; // release the image 
}} // ENDS: thread and aotureleasepool 

Каждый раз, когда программа переходит к строке «MARK» и печатает s ubview, то ясно, что subImageView не удаляется из супервизора. И каждый раз, когда поток заканчивается, возникает «удаленная нить с незафиксированным CATransaction ....».

Что я не так сделал?

ответ

0

я могу решить мою собственную проблему: В соответствии с [subImageView setFrame:subRect];, вставить другую линию: [subImageView.layer setFrame:subRect];

Между тем, добавить еще одну строку перед «addSubview:» метод: [self.view setWantsLayer:YES];.

Это работа. Но я не знаю, почему. Почему я должен установить раму вида и слоя?

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

  • Нет связанных вопросов^_^