2011-03-03 60 views
0

我试图在按(仅按住)按钮时激活我的代码的一部分。当按钮被释放时,我希望我的标签再次隐藏。有没有办法有效地做到这一点?我有一个IBAction(按钮)和一个IBOutlet(一个文本框),此代码设置为动作:在按钮上激活代码仅按住

- (IBAction)toggleIt:(id)sender { 
    if ([myDescription isHidden]) { 
     [myDescription setHidden:NO]; 
    } else { 
     [myDescription setHidden:YES]; 
    } 
} 

任何帮助? (在假人计)

扎克

回答

1

恐怕没有在Mac上的IB这样的方式,因为它有可能在iOS上:

的UIKit与AppKit的 - 尽管在许多方面相似 - 是两个完全不同的野兽。 AppKit的传统可以追溯到20世纪90年代(甚至可能是20世纪80年代后期),它通过几个地方展示(我在看你,NSCell),UIKit的设计经历了大约20年AppKit的。

尽管您可以很容易地告诉UIControl何时将调用其操作(并且可以针对不同事件执行不同操作),但NSControl仅允许您指定要发送的单个操作。

如果您不想覆盖-[NSButtonCell stopTracking:at:inView:mouseIsUp:]-[NSButton mouseDown:]-[NSButton mouseUp:],最简单的方法就是将按钮设置为连续发送其操作。这可能是IB中的骨骼(在“控件”类别下的“属性”检查器中)。

接下来的事情将是使你的描述层支持和重写你的操作方法在这样的方式:

- (IBAction)toggleIt:(id)sender { 
    CALayer *descriptionLayer = [myDescription layer]; 
    [descriptionLayer setHidden:NO]; // (ab-)use implicit animation 
    [descriptionlayer performSelector:@selector(setHidden:) withObject:@"" afterDelay:.1]; 
} 

工作原理:

“隐藏”的CALayer -property具有动画能力,因此,更改它将导致隐式动画。由于Objective C只是C,因此不是0x0的任何内容都被解释为YES,这就是第三行触发的地方:空行显然不是0x0,因此在此操作返回后不久,该层将被调用以隐藏。但是由于CATransitions逐渐发生并且可以在课程中进行更新,因此这只会在动作不再触发时影响层的可见性 - 即不再按下按钮。

0

您可以使用UIControlEventTouchDown隐藏自己的标签,然后显示它在UIControlEventTouchUpInside事件。

-(IBAction)buttonHit { 
    [myDescription setHidden:NO]; 
} 

-(IBAction)buttonReleased { 
    [myDescription setHidden:YES]; 
} 
+0

有没有办法做到这一点没有计时器?我不明白为什么我想延迟我的代码 - 当按钮关闭时,隐藏文本框。发布后,再次显示。似乎它会很容易,不需要计时器? – Zakman411 2011-03-03 05:23:27

+0

@ Zakman411:我想我误解了你原来的问题。我已经更新了我的回复。 – FreeAsInBeer 2011-03-03 05:31:39

+0

我看到 - 我将如何在Interface Builder中实现buttonHit和buttonReleased?我看不出要拖到每个IBAction的内容? – Zakman411 2011-03-03 05:52:32