2015-11-25 2 views
0

У меня есть простое приложение, которое отображает UIPageViewController, когда ячейка нажата на UITableViewController. UIPageViewController (так называемый Leaflets) показывает 6 изображений в очень хорошем расположении, как для iPhone и IPad:Регулировка размеров UIImageView при повороте iPad в альбомную ориентацию

- (void)imageDimensions 
{ 
    [self.view setBackgroundColor:[UIColor clearColor]]; 
    CGRect insetFrame; 
    if (IDIOM == IPAD) 
    { 
     NSLog(@"iPad"); 
     insetFrame = CGRectMake(160, 70, self.view.frame.size.width-320, self.view.frame.size.height-115); 

    } 
    else 
    { 
     NSLog(@"iPhone"); 
     insetFrame = CGRectMake(30, 20, self.view.frame.size.width-60, self.view.frame.size.height-15); 

    } 

    _imageView = [[UIImageView alloc] initWithFrame:insetFrame]; 
    [_imageView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; 
    [_imageView setImage:[UIImage imageNamed:_model.imageName]]; 
    [[self view] addSubview:_imageView]; 

} 

Когда я повернуть IPad в режиме Landscape, в идеале, я хочу insetFrame изменить так, что ISN изображения 'растянулся по экрану.

Я попробовал, поставив NSNotification в viewDidLoad:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceRotated:) name:UIDeviceOrientationDidChangeNotification object:nil]; 

Какие вызовы:

-(void)deviceRotated:(NSNotification*)notification 
{ 
    NSLog(@"Rotation"); 
    CGRect insetFrame; 
    insetFrame = CGRectMake(160, 70, self.view.frame.size.width-620, self.view.frame.size.height-715); 
    _imageView = [[UIImageView alloc] initWithFrame:insetFrame]; 
    [_imageView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; 
    [_imageView setImage:[UIImage imageNamed:_model.imageName]]; 
    [[self view] addSubview:_imageView]; 


} 

Метод здесь определенно вызывался, но есть две проблемы.

Вопросы

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

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

[_imageView removeFromSuperview]; 

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

Я хотел бы способ сказать, если пейзаж, показать этот кадр и портрет, покажите этот кадр.

Любое руководство по этому вопросу будет оценено по достоинству.

ответ

1

Вы пробовали настроить отображение для перерисовки и ретрансляции?

CGRect insetFrame; 
insetFrame = CGRectMake(160, 70, self.view.frame.size.width-620, self.view.frame.size.height-715); 
_imageView = [[UIImageView alloc] initWithFrame:insetFrame]; 
[_imageView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight]; 
[_imageView setImage:[UIImage imageNamed:_model.imageName]]; 
[_imageView setNeedsDisplay]; 
[_imageView setNeedsLayout]; 

Это может сработать для вас. Удалите строку [[self view] addSubview: _imageView]; вы добавляете его на дисплей повторно.

+1

Спасибо @Brooks - это действительно полезно. Таким образом, я проверяю ориентацию и соответствующим образом применяю размер и поместил setNeedsDisplay и setNeedsLayout, который выглядит хорошо. Я также удаляю изображение из супервизора ([_imageView removeFromSuperview];) с ориентацией, но иногда, когда я вращаюсь, изображение не удаляется. Есть ли способ полностью удалить изображение или убедиться, что изображение будет всегда удалено во время вращения? – amitsbajaj

+0

Хороший вопрос. Я бы посоветовал не удалять изображение из UIImageView каждый раз, просто чтобы его перерисовать. Как правило, если вы не можете получить изображение правильно, это означает, что вы упускаете то, что UIKit дает вам уже. Что-то более простое. В этом случае, когда появляется Уведомление, в ViewController поступает много вызовов. Попробуйте поместить изменения размера в метод viewDidLayoutSubviews. –

+1

Это идеальный человек - мне нужно было просто проверить код, но абсолютно, удалив строку удаления кода, убедитесь, что это было перерисовкой каждый раз. Спасибо за помощь в этом - очень ценю это! – amitsbajaj

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