【问题标题】:Create a custom gauge with an image Objective C [closed]使用图像目标 C 创建自定义仪表 [关闭]
【发布时间】:2015-06-23 03:16:39
【问题描述】:

我想为我的应用程序创建一个自定义仪表,它将显示一个心形,动画以从下到上填充。

我不明白如何创建这种效果。

【问题讨论】:

  • 嗨,威利,你还没有解释什么是“大量研究”。 SpriteKit 可以让您轻松构建它,或者您可以使用一些 3D(例如使用 Metal),或者您可以使用 Core Animation。但是,您没有告诉我们您的要求是什么。我们甚至不知道您想要制作这个“应用程序”是在 Mac 上还是在 iPhone 上。另外,鉴于这是一个相对简单的任务,我想知道您为什么使用 Objective-C 而不是更现代的 Swift?

标签: objective-c image gauge


【解决方案1】:

鉴于问题的模糊性,众多解决方案之一是使用核心动画。 Apple 官方文档是here

让我们概述三个步骤:

  • 概念步骤定义您将使用的图层(概念上)或蒙版,并创建将在其中导入的图像
  • 定义步骤定义你的CABasicAnimation并对层进行编程
  • 动画步骤应用你的修改

让我们来看看细节。

概念步骤

假设您选择了三层:

  • 背景
  • 空心形(例如,一条漂亮的银线,或者什么都没有)
  • 填充心形(例如,一颗漂亮的宝石切割成心形、果冻形或苹果红皮……请咨询您的艺术家)

此时,如果您正在为 iPad 构建,您的艺术家已经为您提供了 6 个文件。让我们假设以下名称和类型。

| Name | Type| |:-----:|:––––:| |background.jpg| background picture for iPad Mini | |background@2x.jpg|background picture for iPad Retina and up | |heartenclosure.png| heart border picture for iPad Mini | |heartenclosure@2x.png|heart border picture for iPad Retina and up | |heartbody.png| heart contents picture for iPad Mini | |heartbody@2x.png|heart contents picture for iPad Retina and up |

一旦您拥有这些 JPG/PNG 文件,您就可以将它们导入 Xcode。注意拥有双倍和三倍尺寸的 Retina(和 iPhone 6+)。您将这些拖放到一个名为Images.xcassets 的文件中,该文件(几乎)是您的“图像存储”。

定义步骤

计划是让背景是静态的,心的内容在 jauge 更新时从当前高度动画到新高度,并且心边框作为顶层。

让我们构建背景图像: UIImage* backgroundImg = [UIImage imageNamed:@"background"]; 相同的代码将创建顶部图片: UIImage* heartshapeImg = [UIImage imageNamed:@"heartenclosure"];

iOS 足够聪明,可以选择正确的图像,您不必传入 JPG 或 @2x 信息。默认情况下,添加到显示中的图像的 z-index 是“最新在顶部”。

图片制作完成后,在我的 iPhone 上看起来像 this(我向原画师道歉)。

我们要做的,这只是众多可能性中的一种,是创建三个CALayers 并将它们添加为UIView 的图层子层。 为了我自己的缘故,我基于一颗善良的心 found with Google 制作了一个 heart shape。在你的项目中,你会想要我之前建议的真实艺术;)

构建层的代码进入- (void) viewDidAppear:(BOOL)animated(因为此时框架已经设置好了)。

注意在心脏层上设置的名称,这将允许我们对其进行动画处理。

UIImage* backgroundImg = [UIImage imageNamed:@"background"]; UIImage* heartImage = [UIImage imageNamed:@"Coeur"]; UIImage* heartShapeImage = [UIImage imageNamed:@"Coeurshape"];

CALayer* backgroundLayer = [CALayer layer];
backgroundLayer.contentsGravity = kCAGravityResizeAspect;
backgroundLayer.opacity = 1;
backgroundLayer.opaque = YES;
backgroundLayer.hidden = NO;
backgroundLayer.cornerRadius = 20.0;
backgroundLayer.frame = CGRectInset(self.view.layer.frame, 20, 20);
backgroundLayer.backgroundColor = [[UIColor colorWithRed:1.1 green:1 blue:0 alpha:1.0]CGColor];
backgroundLayer.contents = (__bridge id) backgroundImg.CGImage;
backgroundLayer.contentsScale = [[UIScreen mainScreen] scale];
[self.view.layer addSublayer:backgroundLayer ];

CALayer* heartLayer =[CALayer layer];
heartLayer.contentsGravity = kCAGravityResizeAspect;
heartLayer.shadowOffset = CGSizeMake(0, 3);
heartLayer.shadowRadius = 5.0;
heartLayer.shadowColor = [UIColor blackColor].CGColor;
heartLayer.shadowOpacity = 0.8;
heartLayer.frame = CGRectInset(self.view.layer.frame, 80, 200);
heartLayer.contents = (__bridge id) heartImage.CGImage;
heartLayer.contentsScale = [[UIScreen mainScreen] scale];
[heartLayer setName:@"heartLayer"];
[self.view.layer addSublayer:heartLayer];

CALayer* heartShapeLayer =[CALayer layer];
heartShapeLayer.contentsGravity = kCAGravityResizeAspect;
heartShapeLayer.frame = heartLayer.frame;
heartShapeLayer.contents = (__bridge id)(heartShapeImage.CGImage);
heartShapeLayer.contentsScale = [[UIScreen mainScreen] scale];
[self.view.layer addSublayer:heartShapeLayer];

* 动画步骤*

通过使用CABasicAnimation 更改heartLayer 的边界,启用遮罩:heartLayer.masksToBounds = YES;,然后您可以显示您想要的心脏数量。

为了访问您的子图层,您需要使用其名称。 这个子程序可以解决问题:

- (CALayer *)findLayerByName:(NSString*) layerTagName inLayer:(CALayer*) layer{

    for (CALayer *layer in [layer sublayers]) {

        if ([[layer name] isEqualToString:layerTagName]) {
            return layer;
        }
    }

    return nil;
}

请注意,根据我之前的评论,使用 Swift 是一个不错的选择。 Ray Wenderlich 的网站上有一篇关于UIView animations in Swift 的精彩文章。

【讨论】:

  • 如果你要否决这个答案,至少让他知道原因。
  • 感谢您的回答!为了回应我的研究,我只找到了经典的量规,如线性量规、圆形量规,没有找到任何定制量规。可能是我搜索的不够。真的很有帮助,谢谢,我试试看!我之前从未使用过 Swift,这就是为什么我对 Objective C 感觉更舒服的原因。我真的不知道 Swift 是如何工作的,而且我对 Objective C 不是“超级好”,所以我更喜欢在开始学习如何使用之前改进 Objective C斯威夫特也许我错了让我知道!很抱歉,如果我的问题不是那么有建设性,但我真的什么也没找到。
  • 我已经添加了基础知识,它显示了构成图层的元素。我还描述了解决方案的其余部分。一旦我有时间实际编写/测试代码,我将发布代码,以便您获得完整的解决方案。
  • 非常感谢@Kheldar,这对我真的很有帮助!一切正常。但我不知道动画是如何工作的,我尝试使用 CABasicAnimation 但我唯一成功做的就是通过改变边界来改变大小。对不起,我是新人,我们如何在我们的时刻插入代码?
  • @WillyKim 我在 GitHub 上创建了一个项目,其中包含一些代码供您查看。此外,如果您不太关心动画运行的速度,请不要忘记 Apple 会在您更改参数值时自动运行动画。我有一个分支可以在 repo 中展示这种行为。我还没有完成面具分支,我会尝试花一些时间。
猜你喜欢
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
相关资源
最近更新 更多