Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 有关在iOS中绘图的问题_Iphone_Objective C_Drawing_Drawrect_Cgcontext - Fatal编程技术网

Iphone 有关在iOS中绘图的问题

Iphone 有关在iOS中绘图的问题,iphone,objective-c,drawing,drawrect,cgcontext,Iphone,Objective C,Drawing,Drawrect,Cgcontext,我想在我的iPhone屏幕的底部创建一个小导航栏,在那里我基本上只画5个相邻的矩形。但是,只有活动页面的不透明度应为1.0,其他页面应略微透明(alpha=0.4)这就是我已经拥有的。 现在我的问题是: -(void)drawRect:(CGRect)rect{ CGContextRef context = UIGraphicsGetCurrentContext(); //save state CGContextSaveGState(context); //N

我想在我的iPhone屏幕的底部创建一个小导航栏,在那里我基本上只画5个相邻的矩形。但是,只有活动页面的不透明度应为1.0,其他页面应略微透明(alpha=0.4)这就是我已经拥有的。

现在我的问题是:

-(void)drawRect:(CGRect)rect{

    CGContextRef context = UIGraphicsGetCurrentContext();
    //save state
    CGContextSaveGState(context);

    //NAV1
    CGMutablePathRef nav1 = CGPathCreateMutable();
    CGPathAddRect(nav1, NULL, CGRectMake(0 , 15, 64, 10));
    UIColor *blueColor = UIColorFromRGB(0x35BFE5,0.1);
    CGColorRef bC = [blueColor CGColor];
    [colorArray addObject:(__bridge id)bC];
    [navArray addObject:(__bridge id)nav1];
    CGPathRelease(nav1);
    /*
     *
     *
     ... I do this for all 5 navigation elements

     *
     *
     */

    //then I go through all my rectangles and add/fill them
    for(int i=0;i<[navArray count];i++){
        CGContextAddPath(context, (__bridge CGMutablePathRef)[navArray objectAtIndex:i]);
        CGContextSetFillColorWithColor(context, (__bridge CGColorRef)[colorArray objectAtIndex:i]);
        CGContextFillPath(context);

    }

    // restore to last saved context state 
    CGContextRestoreGState(context);
}

//and this is how I redraw
-(void)updateActiveNav{
    [navArray removeAllObjects];
    [colorArray removeAllObjects];
    [self setNeedsDisplay];
}
  • 如何更改导航中各个元素的不透明度?我是否需要在任何事情发生变化时重新绘制整件事情?所以我会有一个叫做Nav1Capacity,Nav2Capacity…nav5Opacity的全局变量,在导航改变时改变它们,然后重新绘制整个东西?如果是,

  • 我怎样才能弄清楚我以前画过什么?我是否将矩形创建为
    CGMutablePathRef()
    s,并将它们存储在数组中并将其全部清除

我很少有绘画经验,所以我在那里有点迷茫。我已经阅读了Quartz2d和上下文的文档,但正如我提到的,我仍然没有完全理解它是如何工作的

以下是我使用的一些代码:

-(void)drawRect:(CGRect)rect{

    CGContextRef context = UIGraphicsGetCurrentContext();
    //save state
    CGContextSaveGState(context);

    //NAV1
    CGMutablePathRef nav1 = CGPathCreateMutable();
    CGPathAddRect(nav1, NULL, CGRectMake(0 , 15, 64, 10));
    UIColor *blueColor = UIColorFromRGB(0x35BFE5,0.1);
    CGColorRef bC = [blueColor CGColor];
    [colorArray addObject:(__bridge id)bC];
    [navArray addObject:(__bridge id)nav1];
    CGPathRelease(nav1);
    /*
     *
     *
     ... I do this for all 5 navigation elements

     *
     *
     */

    //then I go through all my rectangles and add/fill them
    for(int i=0;i<[navArray count];i++){
        CGContextAddPath(context, (__bridge CGMutablePathRef)[navArray objectAtIndex:i]);
        CGContextSetFillColorWithColor(context, (__bridge CGColorRef)[colorArray objectAtIndex:i]);
        CGContextFillPath(context);

    }

    // restore to last saved context state 
    CGContextRestoreGState(context);
}

//and this is how I redraw
-(void)updateActiveNav{
    [navArray removeAllObjects];
    [colorArray removeAllObjects];
    [self setNeedsDisplay];
}
-(void)drawRect:(CGRect)rect{
CGContextRef context=UIGraphicsGetCurrentContext();
//拯救国家
CGContextSaveGState(上下文);
//导航1
CGMutablePathRef nav1=CGPathCreateMutable();
CGPathAddRect(nav1,NULL,CGRectMake(0,15,64,10));
UIColor*blueColor=UIColorFromRGB(0x35BFE5,0.1);
CGColorRef bC=[蓝色CGColor];
[colorArray addObject:(_桥id)bC];
[navArray addObject:(_桥id)nav1];
CGPathRelease(nav1);
/*
*
*
…我对所有5个导航元素都这样做
*
*
*/
//然后我遍历所有的矩形并添加/填充它们
对于(int i=0;i这就是问题所在:

for(int i=0;i<[navArray count];i++){
        CGContextAddPath(context, (__bridge CGMutablePathRef)[navArray objectAtIndex:i]);
        CGContextSetFillColorWithColor(context, (__bridge CGColorRef)[colorArray objectAtIndex:i]);
        CGContextFillPath(context);

    }
for(int i=0;i如果你真的绘制了界面,你必须在界面发生变化时重新绘制它,至少是变化的矩形。你可以重用CGPATH,但它们不是屏幕上的图形对象,它们只是关于如何绘制形状的说明,所以你必须重新绘制所有东西


也就是说,你可以使用单独的UIView来代替,它代表屏幕上的对象,你可以改变它们的不透明度,这将反映在屏幕上。

在OpenGL开始使用之前,你基本上处于底层。因此,当你自己绘制图形时,有很多样板类的事情需要做。事实上,你必须这样做用新的不透明度自己重新绘制并处理清除它。基本上,当活动元素更改时,使用
setNeedsDisplay:
将自定义视图标记为脏视图,并在绘图时在drawrect中检查活动视图。您能看一下我之前提供的代码吗?它仍然总是在旧导航的基础上绘制,所以基本上擦除我以前绘制的内容根本不起作用…默认情况下,调用drawRect应该清除上次调用drawRect时绘制的内容,除非您自己重新绘制原始内容。我在您显示的代码中没有看到任何可以阻止这种情况发生的内容。好吧,我想我解决了问题。但我不明白为什么上面的e方法不起作用。我的解决方案是简单地将
CGContextClearRect(context,[self-bounds]);
添加到我的drawRect以清除最后绘制的“对象”。但据我所知,drawRect会重新绘制我的整个视图,因此如果我在绘制之前保存上下文,导航项应该被“覆盖”下次调用drawRect时,对吗?我确实在视图上使用了CGAffineTransform。这会不会搞乱帧?这样我可以有效地清除边界而不是帧吗?我会试试看,谢谢。但是我想知道为什么我的代码会出现错误。我不小心把答案投到了上面,不幸的是这对我没有帮助。我复制了你的答案将代码编码到项目中。设置一个简单的点击手势来调用重画,结果很好。我相信你在其他地方破坏了你的上下文。这是代码。我简单复制了你的代码,为y添加了一个随机数,并在屏幕上点击重画。它会反弹,因为它没有保存以前的图形。如果它正在保存上一个图形很明显,它最终会有倍数。要么是发生了复制图形以外的其他事情,要么是在代码的其他地方破坏了上下文。