菜鸟教程小白 发表于 2022-12-13 16:19:53

ios - setNeedsDisplay 未调用 drawRect :(CGRect)rect


                                            <p><p>我正在尝试遵循有关如何在屏幕上绘制一些形状的指南,但在应用程序启动时它工作正常,但我无法使用 <code>setNeedsDisplay</code> “重新绘制”形状我'尝试了很多漂浮的东西,比如在主线程上执行,但它不起作用。</p>

<p>我的应用是由这个组成的:</p>

<p> <img src="/image/G1UDr.png" alt="enter image description here"/> </p>

<p>我的 UIView 有它自己的类,<code>DrawView</code>。这是我的代码:</p>

<p><strong>DrawView.h</strong></p>

<pre><code>#import &lt;UIKit/UIKit.h&gt;

NSInteger drawType;

@interface DrawView : UIView

-(void)drawRect:(CGRect)rect;
-(void)drawNow:(NSInteger)type;

@end
</code></pre>

<p><strong>DrawView.m</strong></p>

<pre><code>#import &#34;DrawView.h&#34;

@implementation DrawView

- (id)initWithFrame:(CGRect)frame
{
    self = ;
    if (self) {
      // Initialization code
    }
    return self;
}

- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();
    UIColor *color = ;
    CGContextSetStrokeColorWithColor(context, color.CGColor);
    CGContextSetFillColorWithColor(context, color.CGColor);

    NSLog(@&#34;Type: %i&#34;,drawType);

    switch (drawType) {
            case 0:
                CGContextMoveToPoint(context, 10, 100);
                CGContextAddLineToPoint(context, 300, 300);
                CGContextSetLineWidth(context, 2.0);
                CGContextStrokePath(context);
                break;
            case 1:
                CGContextAddEllipseInRect(context,CGRectMake(10, 100, 300,440));
                CGContextDrawPath(context, kCGPathFillStroke);
                break;
            case 2:
                CGContextAddRect(context, CGRectMake(10, 100,300,300));
                CGContextDrawPath(context, kCGPathFillStroke);
                break;
            default:
                break;
    }

}


-(void)drawNow:(NSInteger)type {
    drawType = type;
    NSLog(@&#34;Draw Now! %i&#34;,drawType);

    //; // Not working...
    //; // Not Working
}

@end
</code></pre>

<p><strong>ViewController.h</strong></p>

<pre><code>#import &lt;UIKit/UIKit.h&gt;
#import &#34;DrawView.h&#34;

DrawView *mydraw;

@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UISegmentedControl *drawTypeSW;

- (IBAction)drawNow:(id)sender;
@end
</code></pre>

<p><strong>ViewController.m</strong></p>

<pre><code>#import &#34;ViewController.h&#34;

@interface ViewController ()

@end

@implementation ViewController
@synthesize drawTypeSW;

- (void)viewDidLoad
{
    ;
    mydraw = [ init];
}

- (void)viewDidUnload
{
    ;
    ;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (IBAction)drawNow:(id)sender {
    ;
}
@end
</code></pre>

<p>当我打开应用程序时画了一条线,但是当我尝试使用按钮 <code>Draw Now</code> 绘制其他内容时,它不起作用,没有任何反应,并且 <code>- (void)drawRect: (CGRect)rect</code> 未被调用。为什么?我错过了什么?</p>

<p>谢谢;)</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><strong>进一步编辑,最终解决方案</strong>:在 <code>viewDidLoad</code> 中创建的 DrawView 没有作为 subview 添加到 ViewController。添加以下行应使其正确显示(除了下面的其他修复):</p>

<pre><code>;
</code></pre>

<p><strong>编辑</strong>:我的答案的扩展(它仍然存在,但我认为不再是问题的核心)。您正在声明界面的 <code>myDraw</code> <em>outside</em>(并在 DrawView 的头文件中执行类似的操作)。而不是</p>

<pre><code>DrawView *mydraw;

@interface ViewController : UIViewController
//snip
@end
</code></pre>

<p>尝试:</p>

<pre><code>@interface ViewController : UIViewController
{
DrawView *mydraw;
}
//snip
@end
</code></pre>

<p><strong>原答案:</strong>
变量 <code>myDraw</code> 未正确初始化 - <code>UIView</code> 需要使用 initWithFrame(用于编程创建)或 initWithCoder(在 nib 或 Storyboard 中)进行初始化。使用 init 创建它意味着它的框架位置/大小为 0(并且其他 UIView 功能可能未正确初始化),这反过来意味着它不会正确绘制。</p>

<p>尝试 a) 在您的 nib/storyboard 中创建一个 UIView,将其转换为 DrawView,并使您的 ViewController 定义中的 <code>drawView</code> 字段成为该 View 的导出。或者 b) 将其从您的 nib 中移除,使用 initWithFrame 创建您的 DrawView,并为其指定屏幕上的位置和大小。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - setNeedsDisplay 未调用 drawRect :(CGRect)rect,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/12468320/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/12468320/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - setNeedsDisplay 未调用 drawRect :(CGRect)rect