0

touchupinside で 1 つのビューを別のビューに遷移させるターゲット アクションを起動する UIButton があります。

これが発生すると、ボタンの状態も選択済みに変更されますが、選択された状態の (異なる) 背景画像は、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;
}
4

2 に答える 2

0

代わりに、選択したボタンと一緒に強調表示されたUIButtonコントロール状態を使用してみてください。

于 2012-06-11T19:51:30.590 に答える
0

メソッドの 2 番目の部分 (ボタンを選択状態に設定した後) を 2 番目のメソッドに分割してみてください。

次に、 performSelector:withObject:afterDelay: を使用してその 2 番目のメソッドを呼び出します

したがって、メソッドは次のようになります。

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];

2 番目の方法は次のようになります。

- (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 個のオブジェクトをパラメーターとして渡すことができます。一見すると、遷移メソッドの後半にパラメーターが必要なようには見えませんでした。

于 2012-06-12T00:41:29.417 に答える