【问题标题】:Can I access views when drawn in the drawRect method?在 drawRect 方法中绘制时可以访问视图吗?
【发布时间】:2011-01-11 18:38:59
【问题描述】:

在创建 tableViewCell 的内容视图时,我在 drawRect: 内部使用了 drawInRect:withFont、drawAtPoint... 等,因为我只需要放置一些文本。事实证明,绘制的部分文本需要是可点击的 URL。所以我决定创建一个 UIWebView 并将其插入到我的 drawRect 中。一切似乎都很好,问题是没有发生与 UIWebView 的交互。我尝试启用交互,但没有奏效。我想知道,由于使用 drawRect: 我正在绘制到当前图形上下文,我可以做些什么来让我的子视图与用户交互?
这是我在 UITableViewCell 类中使用的一些代码。

-(void) drawRect:(CGRect)rect{  
    NSString *comment = @"something";
    [comment drawAtPoint:point forWidth:195 withFont:someFont lineBreakMode:UILineBreakModeMiddleTruncation];

    NSString *anotherCommentWithURL = @"this comment has a URL http://twtr.us";
    UIWebView *webView = [[UIWebView alloc] initWithFrame:someFrame];
    webView.delegate = self;
    webView.text = anotherCommentWithURL;
    [self addSubView:webView];
    [webView release];
}

正如我所说,视图绘制得很好,但是与外部的 webView 没有交互。 URL 嵌入到 HTML 中并且应该是可点击的。它不是。我让它在另一个视图上工作,但我在那个视图上放置了视图。 有什么想法吗?

【问题讨论】:

    标签: iphone objective-c uiwebview core-graphics drawrect


    【解决方案1】:

    您确实想要创建一个新的UIWebView 并将其添加为每次调用drawRect: 的子视图这是一个非常 坏主意:

    1. 它会很慢。这些都是重物,而您正在制造成千上万个。
    2. 您并没有摆脱旧的UIWebView 对象。因此,您实际上是在将成千上万个它们层叠在一起。

    您应该创建UIWebView 一次,可能是在初始化程序中,或者其他只调用一次的方法中。您还应该只将它作为子视图添加一次。

    创建数千个这样的视图的行为肯定会导致您的问题。

    如果您的视图正在改变位置/大小,那么您可以覆盖setFrame:,并且除了调用超类的方法之外,还可以调整UIWebView 的框架,您肯定希望将其作为实例变量进行维护.

    【讨论】:

      【解决方案2】:

      这是错误的。您不应该在 -drawRect: 中实例化 UIWebView: - 这可能会重复调用以刷新屏幕。

      相反,您至少应该创建一个 UITableViewCell 的子类并向其添加一个 UIWebView 来保存您的所有文本。

      即便如此,UIWebView 可能还是太重了,不能放在每个单元格中。

      您可能想签出this

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 2012-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多