【问题标题】:Delay when changing gradient on a UIButton更改 UIButton 上的渐变时延迟
【发布时间】:2011-05-19 13:38:44
【问题描述】:

我将两个CAGradientLayers 放在UIButton 上,然后根据按钮是否突出显示(手指向下)来更改图层。

问题在于梯度变化需要几分之一秒。起初它褪色了,我通过清除图层上的所有动画来解决这个问题。

两个渐变都是预先创建的,在 touchDown 时,高亮渐变将其隐藏变量设置为 FALSE,我认为这应该是即时的吗?我错过了什么?有没有更好的方法来实现这一点?

Code is here:

代码的目的是创建按钮,如此处显示的登录按钮:

【问题讨论】:

    标签: objective-c cocoa-touch ios4 uibutton


    【解决方案1】:

    尝试从 UIButton 的 setHighlighted 方法而不是 touchUp: 和 touchDown 调用 updateControlStatesetHighlighted 应该在触摸事件发生时被自动调用。我之前用CAGradientLayers 做了一个类似的按钮,它可能比你现在得到的更快。

    -(void)setHighlighted:(BOOL)highlighted
    {
        [super setHighlighted:highlighted];
        [self updateControlState];
    }
    

    【讨论】:

      【解决方案2】:

      CALayer 的某些属性具有隐式动画。 hidden 就是其中之一。你应该这样做来抑制隐式动画 -

      [CATransaction begin];
      [CATransaction disableActions];
      [gradientLayerSelected setHidden:FALSE];
      [CATransaction commit];
      

      【讨论】:

        【解决方案3】:

        问题可能是由于所有绘图都是在主线程上进行的。如果主线程被其他源占用,则绘图不会更新,直到主线程再次调用绘图函数。

        我在解析 XML 文件时尝试更新 UIProgressBar 时遇到了这个问题。显然NSXMLParser 在主线程上运行,所以我的progressBar 在解析器完成解析之前没有更新它的进度。我不得不打电话给

        [bar setProgress:float]
        

        像这样:

        [bar performSelectorOnMainThread:@selector(setProgress:) withObject:float]; 
        

        希望这会有所帮助。

        【讨论】:

        • 好主意,但当时我没有在主线程中做任何其他事情,我试图改变渐变。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-07
        • 2017-05-29
        • 1970-01-01
        • 2021-12-20
        相关资源
        最近更新 更多