0

我有一个 UIButton 触发一个目标动作,导致一个视图在 touchupinside 上转换到另一个视图。

发生这种情况时,我还将按钮的状态更改为选中,但所选状态的(不同)背景图像在 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

尝试将方法的第二部分(将按钮设置为选定状态后)分解为第二种方法。

然后使用 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 个对象作为参数。乍一看,您的过渡方法的后半部分似乎不需要任何参数。

于 2012-06-12T00:41:29.417 回答