gpt4 book ai didi

iphone - 在 BubbleLevel 示例代码中在 iPhone 上重绘 UIControls/UIButtons

转载 作者:行者123 更新时间:2023-12-03 21:22:10 25 4
gpt4 key购买 nike

我对何时应该调用 -setNeedsDisplay 感到困惑。例如,为了在两次按下之间更新具有不同图像的按钮(在两次之间切换),Apple 的示例代码显示在 UIButton 上调用 -setImage。不过,在那之后我找不到对 -setNeedsDisplay 的调用。那么 UIControl 方法是否都在内部执行 -setNeedsDisplay,因此 -setNeedsDisplay 仅在操作 UIView 实例时使用?或者有更具体的语义吗?如果我子类化 UIView,我的方法是否应该始终在内部处理重绘?文档中是如何/在哪里指定的?

来自LevelView.m在 BubbleLevel 源代码中:

- (void)toggleHoldButton:(id)sender {
if (holdButtonIsShowing == YES)
{
holdButtonIsShowing = NO;
[holdButton setImage:[UIImage imageNamed:@"release_button.png"] forState:UIControlStateNormal];
} else
{
holdButtonIsShowing = YES;
[holdButton setImage:[UIImage imageNamed:@"hold_button.png"] forState:UIControlStateNormal];
}
}

最佳答案

setNeedsDisplay 用于重新渲染或重新绘制 View (UIView 或 UIView 子类实例)。从我们的角度来看:它调用了drawRect:,但实际上在此之前它准备了上下文并使 View 准备好重新绘制。 (这就是为什么你不应该直接调用drawRect:)

通常的情况是当您实现了drawRect:方法时(一些示例:在 View 中使用OpenGL绘制内容或使用CoreText绘制文本或使用CoreGraphics绘制一些图形等)如果你想在某个时刻显式更新绘图,你可以调用 setNeedsDisplay ,它会调用drawRect:,你的 View 将立即重绘。如果没有,当 View 的边界发生变化以及在其他一些情况下,当系统决定有必要重绘 View 时,drawRect:方法将被调用。

对于按钮,您不需要这样做,因为当按下按钮时,肯定会完成对 setNeedsDisplay 的内部调用,使按钮发生变化等(谁真正知道后台发生了什么.问题是,当以这种方式使用 UIButtons 时,您不必担心 drawRect: )

您还可以通过移动 View 的子图层或 subview 来更改 View 的外观,这并不一定意味着重新绘制 View 。当您将 View 视为容器而不是绘图对象时,就会出现这种情况。

一个好的规则可能是,如果您没有实现drawRect:方法,则不需要显式调用setNeedsDisplay。

http://developer.apple.com/iphone/library/documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/drawRect :

希望有帮助。

;)

更新:2009/09/09

UIButton 调用drawRect: 的方式取决于它的实现,我们不应该关心它(至少如果我们没有子类化的话)。但如果你真的知道它,你可以继承它并重写:

- (void) drawRect:(CGRect)frame{
NSLog(@"%s is being called!!!", _cmd);
[super drawRect:frame];
}

现在从另一个对象尝试加载它,调整它的大小,移动它,滚动它(如果可用),隐藏它并查看调试控制台(Cmd + Shift + R)我建议不仅对 UIButton 这样做,而且对普通的 UIView 也这样做。当调用drawRect:时,这肯定会给出一个清晰的想法。 ;)(还有其他方法,如layoutSubviews:等)

我之所以说我们不应该关心UIButton中的drawRect:是因为我们不需要它,我们使用setImage:forState:预设了某个状态的图像,仅此而已。我们可以随时重新设置这些图像,按钮将根据需要更改其图像,并且可能会根据苹果工程师的设计方式重新绘制其 View 。

关于你的问题setNeedsDisplay是否符合我给你的规则。我相信是的。我在每个方法的开头放置了一个断点,什么也不做,并检查调用 setNeedsDisplay 时发生的情况。 LeverView 的任何方法都没有被调用!然后我评论了setNeedsDisplay的3次调用,结果是一样的! (iOS4.1)因此不需要这三行代码。 ;)

调用 setNeedsDisplay 时必须小心,因为根据您的实现,它可能会使您的程序非常慢!因为要重新绘制所有内容,并且可能没有必要。 ;)

噗……哈哈。一篇很长的文章只关于drawRect:

干杯

关于iphone - 在 BubbleLevel 示例代码中在 iPhone 上重绘 UIControls/UIButtons,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3669770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com