Выполнить метод, когда рамка UIView меняет свой размер iPhone iPad - PullRequest
1 голос
/ 14 июля 2011

У меня есть элемент управления UIView в файле пера, над которым я работаю. В этом UIView я могу разместить другие файлы пера. При повороте iPad выполняется метод -(void)deviceOrientationChanged:(NSNotification *)note{, и я изменяю размер UIView в зависимости от того, вошел ли iPad в альбомный или портретный режим. В подклассе (файл пера, который находится в контроллере UIView) мне нужно знать, входит ли iPad в режим пейзаж или портретный режим. Ниже представлен рисунок, демонстрирующий файл пера, содержащий элемент управления UIView, и этот элемент управления UIView, содержащий другой файл пера:

enter image description here

зеленый прямоугольник - это элемент управления UIView, а внутри я поместил еще один xib-файл.

Итак, я разместил того же делегата - (void)deviceOrientationChanged:(NSNotification *)note{. проблема, когда я это делаю, заключается в том, что иногда делегат подпредставления выполняется, а другой - нет. Это происходит только на реальном iPad, а не на симуляторе. Если iPad перейдет в ландшафтный режим, я бы хотел, чтобы оба делегата были казнены. В большинстве случаев это не проблема, но если я немного наклоню iPad, будет казнен только один делегат. Вот почему я думал о вызове метода в подклассе, когда размер его кадра изменяется. Также я знаю, что могу вызвать метод из зеленого файла nib, но это похоже на презентацию PowerPoint, в которой есть около 60 слайдов, поэтому я просто изменяю динамику представления. В C # я мог бы вызвать метод динамического типа данных, используя отражение. Я не знаю, если что-то подобное существует для iPhone.

В КРАТКОМ Я ХОЧУ, ЧТОБЫ ИДЕТ ДЕЛЕГАТЫ (ОДИН ИЗ ФАЙЛА СИБ, С КОТОРЫМ Я РАБОТАЮ, И ОБЗОР УПРАВЛЕНИЯ UIVIEW), ЧТОБЫ ИСПОЛЬЗОВАТЬСЯ В ТО ЖЕ ВРЕМЯ.

1 Ответ

0 голосов
/ 14 июля 2011
BOOL myBool;

// this function get's called when the orientation of the ipad changes
- (void)deviceOrientationChanged2:(NSNotification *)note{

    // do not call this method untill other method finish executing it...
    if(myBool==YES)
        return;

    myBool=YES;


    // wait half a second then call handlerTimer method
    NSTimer *timer;
    timer = [NSTimer scheduledTimerWithTimeInterval: (.5)
                                             target: self
                                           selector: @selector(handleTimer:)
                                           userInfo: nil
                                            repeats: NO];
}

-(void) handleTimer:(NSTimer*)theTimer{

    // this method just uses a diferent image on landscape mode compared to portrait mode


    // if the image is in landscapemode for example and it is the one for landscape then don't change its alpha the image will not be changed
    if( (imgTextbox.image == [UIImage imageNamed:@"introPaswordVertical.png"] && [super view].frame.size.width>800) || (imgTextbox.image == [UIImage imageNamed:@"introPasswordHorizontal.png"] && [super view].frame.size.width<800))
    {
        imgTextbox.alpha = 0;
    }


    // if the super view is in portrait mode then place the vertical image
    if([super view].frame.size.width<800)
    {
        imgTextbox.image = [UIImage imageNamed:@"introPaswordVertical.png"];
    }
    else // otherwise place the otherone
    {
        imgTextbox.image = [UIImage imageNamed:@"introPasswordHorizontal.png"];

    }

    // animate the image
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.55];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseIn];
    imgTextbox.alpha = 1;
    [UIView commitAnimations];

    myBool=NO;  // enable deviceOrientationChanged2 to be called again
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...