0

У меня есть UIButton, который запускает действие цели, заставляя один вид перейти на другой на touchupinside.Как перенести изменение состояния UIButton перед запуском других анимаций UIView?

Если это произойдет, я также изменю состояние кнопки на выбранное, но фоновое изображение (для другого) на выбранном состоянии фактически не рисуется до завершения перехода UIView (или иногда оно также похоже на переход с переходом UIView .)

Как заставить кнопку перерисовывать новое фоновое изображение перед началом перехода к представлению?

код, который работает на UIControlEventTouchUpInside:

RhSubTab *activeTab; 
for(RhSubTab *tab in self.tabViews.copy) { 
    tab.selected = NO; 
    [self.view bringSubviewToFront:tab]; 
    if(tab.tag == type) activeTab = tab; 
} 
[self.view bringSubviewToFront:activeTab]; 
[activeTab setSelected:YES]; 

UIView *oldView; 
UIView *newView; 
for(UIView *view in self.contentViews.copy) { 
    if([self.view.subviews containsObject:view]) { 
     oldView = view; 
    } 
    if(view.tag == type) { 
     newView = view; 
    } 
} 

if(!oldView) [self.view addSubview:newView]; 
else [UIView transitionFromView:oldView toView:newView duration:0.5 options:(UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseInOut) completion:nil]; 

и кнопка заказа (RhSubTab) Класс:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
self = [super initWithCoder:aDecoder]; 
if(self) { 
    [self setBackgroundImage:[[UIImage imageNamed:@"SubContentTabBg.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 9, 0, 40)] forState:UIControlStateNormal]; 
    [self setBackgroundImage:[[UIImage imageNamed:@"SubContentTabBg-selected.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 9, 0, 40)] forState:UIControlStateSelected]; 
} 
return self; 
} 

ответ

0

Попробуйте разбить вторую часть вашего метода (после установки кнопки в выбранное состояние) во второй метод.

Затем используйте performSelector: withObject: afterDelay: вызвать этот второй метод

Так что ваш метод может выглядеть следующим образом:

RhSubTab *activeTab; 
for(RhSubTab *tab in self.tabViews.copy) { 
    tab.selected = NO; 
    [self.view bringSubviewToFront:tab]; 
    if(tab.tag == type) activeTab = tab; 
} 
[self.view bringSubviewToFront:activeTab]; 
[activeTab setSelected:YES]; 

[self performSelector: @selector(doTransition) withObject: nil afterDelay: 0]; 

И ваш второй метод может выглядеть следующим образом:

- (void) doTransition; 
{ 
    UIView *oldView; 
    UIView *newView; 
    for(UIView *view in self.contentViews.copy) { 
    if([self.view.subviews containsObject:view]) { 
     oldView = view; 
    } 
    if(view.tag == type) { 
     newView = view; 
    } 
    } 

    if(!oldView) [self.view addSubview:newView]; 
    else [UIView transitionFromView: oldView 
    toView:newView duration:0.5 
    options: (UIViewAnimationOptionTransitionCrossDissolve|UIViewAnimationCurveEaseInOut) 
    completion:nil]; 
} 

Даже при значении задержки 0, performSelector: withObject: afterDelay: немедленно возвращается и не запускает указанный метод до следующего пути через цикл событий, после проверки событий пользователя, обновления экрана обработки и т. д.

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

Метод performSelector: withObject: afterDelay: позволит вам передать 0 или 1 объект в качестве параметров. С первого взгляда это выглядело не так, как во второй половине вашего метода перехода нужны какие-либо параметры.

+0

Awesome. Если вы используете значение 0, а затем слишком быстро нажимаете кнопку, я вижу такое же поведение. Тем не менее, я помню, что с быстрым краном, UIControlEvents не всегда вызывается в «правильном» порядке. Добавление небольшой задержки (.1s) фиксировало ее в обоих случаях и в основном незаметно. – astoffel

0

Попробуйте использовать состояние управления UIButton выделен вместо вместе с выбранной кнопкой.

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