触发drawRect重绘视图的按钮

Posted

技术标签:

【中文标题】触发drawRect重绘视图的按钮【英文标题】:Button to trigger drawRect to redraw a view 【发布时间】:2013-02-26 08:11:34 【问题描述】:

我有一个带有子视图的 VC。在subview level 我有一个按钮。我希望按钮导致视图被更新。

IBAction 代码在 VC 中。它当前所做的只是切换BOOL 值。

返回子视图drawRect:方法是测试BOOL并相应改变视图的代码。

我的观察是,当按下按钮时,IBAction 代码运行,切换BOOL,但drawRect: 方法没有被调用。

我尝试手动调用 drawRect (不好的做法,没有工作)。我尝试调用 setNeedsDisplay 但这也不起作用(无法弄清楚如何引用以编程方式创建的子视图)。

欢迎提出建议。

IBAction 代码很简单,但包含在下面:

- (IBAction)rotateWindowButtonWasPressed:(id)sender

    // just flip the boolean here. Need to make the code change in drawRect: in top2View.m
    if ([myGlobals gWinVertical])
        [myGlobals setGWinVertical:NO];
    else
        [myGlobals setGWinVertical:YES];
    // Hoping this would force a redraw, but bounds have to change...:(
    //_top2ViewOutlet.contentMode = UIViewContentModeRedraw;

【问题讨论】:

更漂亮的快捷方式:[myGlobals setGWinVertical:![myGlobals gWinVertical]]; 【参考方案1】:

要发出 drawRect 调用,请在您更改的视图上调用 setNeedsDisplay。操作系统将在其上调用 drawRect 并自动影响重叠视图。

我认为你的情况

[self.view setNeedsDisplay]

【讨论】:

【参考方案2】:

不确定发生了什么 - 上面有一个答案解决了我的问题,但现在它消失了?无论如何 - 答案是以编程方式创建按钮,然后我可以在 drawRect: 所在的子视图级别包含该方法,并使用 setNeedsDisplay 重新绘制屏幕。这与使用 IB 并在 VC 级别拥有 IBAction 代码。

【讨论】:

以上是关于触发drawRect重绘视图的按钮的主要内容,如果未能解决你的问题,请参考以下文章

drawRect & layoutSubviews 调用时间

请教关于drawRect的调用问题

UIView的layoutSubviews和drawRect方法何时调用

UIView的layoutSubviews和drawRect方法何时调用

加速 -drawRect: UIView 子类的方法

空drawRect实现导致内存警告