代码之家  ›  专栏  ›  技术社区  ›  frankodwyer

在iphone视图中显示半星评级的简单/快速方法是什么

  •  1
  • frankodwyer  · 技术社区  · 15 年前

    我有一个(浮动)评级值,以0..100的百分比表示(其中50=刚刚好,0=糟糕,100=最好)。

    • 简单(理想情况下,仅使用基于一颗或五颗星星的png的绘图操作,无需借助photoshop。)
    • 相当快(这是表格视图中单元格的一部分)
    • 显示评级为0(或接近0)的合理值

    (这只是一个显示,所以我不需要它来响应触摸事件,尽管那会很好-目前我只是使用一个滑块来捕捉评级)

    2 回复  |  直到 15 年前
        1
  •  5
  •   frankodwyer    15 年前

    我想出了一个简单的方法,不用任何PNG就可以做到这一点。我对UIView进行了子类化,然后在drawRect中完成了以下操作:

    - (void)drawRect:(CGRect)rect {
        // Drawing code
        CGContextRef context = UIGraphicsGetCurrentContext();
        [textColor set];
        NSString* stars=@"★★★★★";
        rect=self.bounds;
        UIFont *font = [UIFont boldSystemFontOfSize: 16];
        CGSize starSize = [stars sizeWithFont: font];
        rect.size=starSize;
        [@"☆☆☆☆☆" drawInRect:rect withFont: font];
        CGRect clip=rect;
        clip.size.width=clip.size.width*rating/100;
        CGContextClipToRect(context,clip);
        [stars drawInRect:rect withFont:font];
    }
    

    (这些字符串是5个空的和5个满星,以防它们只显示在我的mac上。我刚刚使用“特殊字符”菜单在IB中输入了它们)

    我添加了textColor(UIColor*)和rating(int)属性,这就是它们的来源。

    要在IB中添加视图,我只需将类类型更改为UIView子类的名称。然后我可以将视图添加到IB中的任何容器中。

        2
  •  5
  •   phillipuniverse    14 年前

    我会考虑将两个UIIVIEVIEW直接层叠在上面。底部图像视图将包含一个由五颗“空”星组成的PNG,而顶部图像视图将包含一个由五颗“满”星组成的PNG。我会根据等级调整顶层的宽度,以暴露底层的空白起始点。

    newStarLayerWidth = fullStarLayerWidth * (percentage / 100)
    

    如果这不够快,我会采取同样的方法,但直接绘制细胞描述 here