Сдвиг UIView влево и вправо - PullRequest
1 голос
/ 29 января 2012

Я пытаюсь анимировать UIView, чтобы скользить влево и вправо. Я попытался сделать снимок экрана текущего представления, а затем заменить его снимком экрана при обновлении содержимого представления за кадром, а затем выполнить анимацию. Но скриншот не отображается на экране. Это просто черный, пока оригинальный вид не скользит обратно на экран. Вот код, который я использую:

    UIGraphicsBeginImageContext(self.view.window.frame.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.frame.size.width, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height)];
    iv.image = image;
    [self.view.window insertSubview:iv aboveSubview:self.view];
    self.view.frame = CGRectMake(-self.view.frame.size.width, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
    [UIView transitionWithView:self.view duration:0.5 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        iv.frame = CGRectMake(self.view.frame.size.width*2, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
        [self loadData];
        self.view.frame = CGRectMake(0, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);
    } completion:NULL];
    [iv removeFromSuperview];
    [iv release];

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Я нашел проблему. Я просто должен был сделать [iv removeFromSuperview]; в блоке завершения. Сейчас работает.

0 голосов
/ 29 января 2012

Обычно вам требуется только одно окно в вашем приложении, содержащее все ваши представления, поэтому self.view.window не очень хороший подход, я думаю ...

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

Например, если вы работаете на iPhone:

UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 960.0f, 480.0f)];

firstView.frame = CGRectMake(0.0f, 0.0f, 320.0f, 480.0f);
secondView.frame = CGRectMake(320.0f, 0.0f, 320.0f, 480.0f);
thirdView.frame = CGRectMake(640.0f, 0.0f, 320.0f, 480.0f);

[containerView addSubview:firstView];
[containerView addSubview:secondView];
[containerView addSubview:thirdView];

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

Другим подходом может быть использование UIScrollView в качестве containerView.

Надеюсь, это поможет ...

РЕДАКТИРОВАТЬ: Я неправильно понял ваш вопрос, извините. Следующая попытка ...

Когда вы добавляете свой скриншот, вы добавляете его в правой части экрана (за кадром)

UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.frame.size.width, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height)];
    iv.image = image;
    [self.view.window insertSubview:iv aboveSubview:self.view];

Затем вы перемещаете исходный вид слева (за кадром)

    self.view.frame = CGRectMake(-self.view.frame.size.width, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height);

Но вы не показываете свой скриншот, поэтому представление пустое.

Я думаю, вы должны изменить это

UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(self.view.frame.size.width, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height)];

К этому

UIImageView *iv = [[UIImageView alloc] initWithFrame:CGRectMake(0.0f, self.view.frame.origin.y, self.view.frame.size.width, self.view.frame.size.height)];

Или вы можете добавить анимацию, чтобы показать ее справа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...