【问题标题】:How to update/redraw UIView如何更新/重绘 UIView
【发布时间】:2014-01-18 19:49:46
【问题描述】:

我有一个UIView,在视图的drawRect 方法中,我使用CGRect 绘制线条,使用UILabel 在视图上绘制标签。

一旦触摸视图,我想更改线条的颜色。当视图被触摸时,它会通知我的ViewController 有触摸:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.controller viewTouched:self];
}

我的ViewController 的响应是从父视图中删除视图,创建新的UIView,并设置任何必要的属性,包括线条的新颜色,并将视图重新添加到父视图:

-(void)redrawView:(SomeView *)view asSelected:(BOOL)selected
{
    [view removeFromSuperview];
    SomeView *newView = [[SomeView alloc] initWithFrame:view.frame];
    newView.tintColor =  (selected) ? [UIColor blueColor] : [UIColor redColor];
    newView.controller = self;
    [self.scrollView addSubview:newView];
}

我遇到的问题是 UILabel 永远不会从 UIView 中删除。它不断在旧的 UILabel 之上绘制一个新的 UILabel。

我是否正确地重绘了视图?我是否以最有效的方式重绘视图?关于重绘视图,我不明白什么?

非常感谢您的帮助。

【问题讨论】:

  • frame 来自哪里?无论如何,我会首先添加一些 NSLog 语句来跟踪执行流程。首先,确保所有这些方法都被实际调用,其次,确保您没有遇到 nil 问题,或者您的框架不正确或其他任何问题。
  • 框架在那里,看起来我意外删除了问题中的行。我没有看到任何 nil 问题,我一直在逐步解决它,但无法弄清楚它为什么不起作用。
  • 你能重新编辑删除的行吗?
  • 当然,但我怀疑这会帮助任何人解决我的整体问题。 ;)
  • 出于多种原因,您在此处发布的代码应该与您实际拥有的代码相同。

标签: ios objective-c uiview drawrect redraw


【解决方案1】:

尝试将 redrawView 方法代码放在 UIView 类的 drawRect 中。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.controller viewTouched:self]; // ask to refresh your view inside viewTouched 
                                        // by calling [self setNeedsDisplay:YES]; there
}

【讨论】:

  • 是的,它可以改变视图的颜色。但是,对于我的具体问题,假设我有 5 个相同的观点。当我点击每个视图时,它应该更改该视图上的线条颜色并将每个其他视图的线条颜色设置为默认颜色。我所做的与单选按钮的工作方式非常相似。选择一个,它会取消选择其他。我的基本功能已关闭,但重绘工作不正常。
  • 将属性添加到您的视图类 BOOL isTouched。当触摸发生时,将该特定视图更改为“是”。然后查看视图并调用 [self setNeedsDispay: YES];...在 drawRect 内部检查 isTouched...如果是 YES 一种颜色,NO - 返回默认值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多