2013-04-25 2 views
0

У меня проблема с приложением, которое не будет устанавливать рамки вне методов -init и -viewWillLayoutSubviews. То, что должно произойти, когда вы нажимаете editButton, - это анимация, которая скроет вид редактора. Тем не менее, ничего не происходит, когда я проверяю это. Проблема не возникает из метода анимации, поскольку метод -setFrame, поскольку он - не включен в блок - не работает ни.setFrame ничего не сделает

Вот код:

-(id)init { 

    if (self = [super init]) { 

     editButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(editButtonTapped)]; 
     doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneButtonTapped)]; 


     editor = [[UIView alloc] init]; 
     [editor setBackgroundColor:[UIColor yellowColor]]; 
     editor.clipsToBounds = YES; 
     editorIsOpen = YES;   

     portraitRegularModeEditorRect = CGRectMake(15, 59, 738, 100); 
     portraitClosedEditorEditorRect = CGRectMake(15, 59, 738, 0); 


    } 
    return self; 

} 


- (void)viewDidLoad { 

    [super viewDidLoad]; 

    [[self view] addSubview:editor]; 
    [[self view] setBackgroundColor:[UIColor blueColor]]; 

} 


-(void)viewDidAppear:(BOOL)animated { 

    [self setForRegularMode]; 

} 




-(void)viewWillLayoutSubviews { 

    UIInterfaceOrientation io = [[UIApplication sharedApplication] statusBarOrientation]; 
    if (io == UIInterfaceOrientationPortrait || io == UIInterfaceOrientationPortraitUpsideDown) { 

     //portrait 
     [editor setFrame:portraitRegularModeEditorRect]; 


    } else { 

     //landscape 

    } 


} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return (interfaceOrientation == UIInterfaceOrientationPortrait); 
} 


-(void)editButtonTapped { 

    [self setForScenarioLinesEditingMode]; 

} 

-(void)doneButtonTapped { 

    [self setForRegularMode]; 

} 


-(void)setForRegularMode { 

    editingMode = CPRegularMode;  

    if (!editorIsOpen) { 

     [UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationCurveEaseOut animations:^(void){ 

      [editor setFrame:portraitRegularModeEditorRect]; 

     } completion:^(BOOL finished) { 

      editorIsOpen = YES; 

     }]; 

    } 


    [[self navigationItem] setRightBarButtonItems:[[NSArray alloc] initWithObjects:editButton,nil]]; 

} 



-(void)setForScenarioLinesEditingMode { 

    editingMode = CPScenarioLinesEditingMode; 

    if (editorIsOpen) { 

     [UIView animateWithDuration:0.3 delay:0.0 options:UIViewAnimationCurveEaseOut animations:^(void){ 

      [editor setFrame:portraitClosedEditorEditorRect]; 

     } completion:^(BOOL finished) { 

      editorIsOpen = NO; 

     }]; 

    } 

    [[self navigationItem] setRightBarButtonItems:[[NSArray alloc] initWithObjects:doneButton,nil]]; 


} 

Если кто-то может помочь, заранее спасибо;)

+0

Вы действительно вызываете методы 'setFrame:'? – Sulthan

+0

Хотел бы я знать. То, что я могу сказать, это все до того, как все называется. Как я могу проверить? – user2006934

+0

Отладчик, например. Или просто 'NSLog'' frame' и 'editor. – Sulthan

ответ

1

Я думаю, что проблема в вашем случае заключается в том, что в установленном вами методе -(void)viewWillLayoutSubviews вы можете указать рамку по умолчанию вашего представления, если вы попытаетесь изменить кадр в других методах после вызова setFrame в вашем представлении, также будет вызываться -(void)viewWillLayoutSubviews, и рамка представления будет по умолчанию. Попробуйте удалить setFrame из вашего -(void)viewWillLayoutSubviews.

1

Является ли ваш контроллер представления установлен в раскадровки, и вы используете Autolayout (который по умолчанию ?) Если это так, setFrame не будет работать, и вам нужно будет редактировать ограничения после создания точек доступа к ним из раскадровки.

В качестве альтернативы вы можете отключить автозапуск в раскадровке, как показано на рисунке here.

+0

Привет, я не использую раскадровку. – user2006934

+0

Является ли Autolayout по умолчанию, даже если я не использую раскадровки? – user2006934

+0

Раскадровки или xibs, начиная с ios6 и далее. Если вы не используете его, мой ответ бесполезен. – jrturton

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