- objective-c - iOS 5 : Can you override UIAppearance customisations in specific classes?
- iphone - 如何将 CGFontRef 转换为 UIFont?
- ios - 以编程方式关闭标记的信息窗口 google maps iOS
- ios - Xcode 5 - 尝试验证存档时出现 "No application records were found"
iOS 5 改变了内置 Google map 应用程序绘制路线的方式:
我现在想在我自己的应用程序中复制路线叠加层的设计,但我目前只能绘制一条普通的蓝线。我想添加带有渐变、边框和发光的 3D 效果。关于如何实现这一目标的任何想法?
目前我正在使用以下代码:
CGContextSetFillColorWithColor(context, fillColor.CGColor);
CGContextSetLineJoin(context, kCGLineJoinRound);
CGContextSetLineCap(context, kCGLineCapRound);
CGContextSetLineWidth(context, lineWidth);
CGContextAddPath(context, path);
CGContextReplacePathWithStrokedPath(context);
CGContextFillPath(context);
导致一条相当难看的线:
谢谢!
更新:该解决方案应该适用于 iOS 4.0 及更高版本。
最佳答案
我认为@ChrisMiles 是正确的,因为这些片段可能是单独绘制的。 (我最初认为使用 CGPatternRef
可能是可行的,但您无权访问模式绘制回调中的 CTM 或路径端点。)
考虑到这一点,这里有一个非常粗略的粗略示例,说明您可以如何开始这样的工作(分别填充各个部分)。请注意:
希望这至少可以让您入门(并完成一些解析几何)。
- (CGGradientRef)lineGradient
{
static CGGradientRef gradient = NULL;
if (gradient == NULL) {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGColorRef white = [[UIColor colorWithWhite:1.f
alpha:0.7f] CGColor];
CGColorRef blue = [[UIColor colorWithRed:0.1f
green:0.2f
blue:1.f
alpha:0.7f] CGColor];
CGColorRef lightBlue = [[UIColor colorWithRed:0.4f
green:0.6f
blue:1.f
alpha:0.7f] CGColor];
CFMutableArrayRef colors = CFArrayCreateMutable(kCFAllocatorDefault,
8,
NULL);
CFArrayAppendValue(colors, blue);
CFArrayAppendValue(colors, blue);
CFArrayAppendValue(colors, white);
CFArrayAppendValue(colors, white);
CFArrayAppendValue(colors, lightBlue);
CFArrayAppendValue(colors, lightBlue);
CFArrayAppendValue(colors, blue);
CFArrayAppendValue(colors, blue);
CGFloat locations[8] = {0.f, 0.08f, 0.14f, 0.21f, 0.29f, 0.86f, 0.93f, 1.f};
gradient = CGGradientCreateWithColors(colorSpace,
colors,
locations);
CFRelease(colors);
CGColorSpaceRelease(colorSpace);
}
return gradient;
}
- (void)drawRect:(CGRect)rect
{
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSaveGState(context);
CGContextSetAllowsAntialiasing(context, YES);
CGContextSetShouldAntialias(context, YES);
// Fill background color
[[UIColor whiteColor] setFill];
UIRectFill(rect);
// Build a path
CGFloat strokeWidth = 10.f;
CGContextSetLineWidth(context, strokeWidth);
CGGradientRef gradient = [self lineGradient];
CGPoint points[9] = {
CGPointMake(10.f, 25.f),
CGPointMake(100.f, 100.f),
CGPointMake(100.f, 150.f),
CGPointMake(22.f, 300.f),
CGPointMake(230.f, 400.f),
CGPointMake(230.f, 200.f),
CGPointMake(300.f, 200.f),
CGPointMake(310.f, 160.f),
CGPointMake(280.f, 100.f)
};
for (NSUInteger i = 1; i < 9; i++) {
CGPoint start = points[i - 1];
CGPoint end = points[i];
CGFloat dy = end.y - start.y;
CGFloat dx = end.x - start.x;
CGFloat xOffset, yOffset;
// Remember that, unlike Cartesian geometry, origin is in *upper* left!
if (dx == 0) {
// Vertical to start, gradient is horizontal
xOffset = 0.5 * strokeWidth;
yOffset = 0.f;
if (dy < 0) {
xOffset *= -1;
}
}
else if (dy == 0) {
// Horizontal to start, gradient is vertical
xOffset = 0.f;
yOffset = 0.5 * strokeWidth;
}
else {
// Sloped
CGFloat gradientSlope = - dx / dy;
xOffset = 0.5 * strokeWidth / sqrt(1 + gradientSlope * gradientSlope);
yOffset = 0.5 * strokeWidth / sqrt(1 + 1 / (gradientSlope * gradientSlope));
if (dx < 0 && dy > 0) {
yOffset *= -1;
}
else if (dx > 0 && dy < 0) {
xOffset *= -1;
}
else if (dx < 0 && dy < 0) {
yOffset *= -1;
xOffset *= -1;
}
else {
}
}
CGAffineTransform startTransform = CGAffineTransformMakeTranslation(-xOffset, yOffset);
CGAffineTransform endTransform = CGAffineTransformMakeTranslation(xOffset, -yOffset);
CGPoint gradientStart = CGPointApplyAffineTransform(start, startTransform);
CGPoint gradientEnd = CGPointApplyAffineTransform(start, endTransform);
CGContextSaveGState(context);
CGContextMoveToPoint(context, start.x, start.y);
CGContextAddLineToPoint(context, end.x, end.y);
CGContextReplacePathWithStrokedPath(context);
CGContextClip(context);
CGContextDrawLinearGradient(context,
gradient,
gradientStart,
gradientEnd,
kCGGradientDrawsAfterEndLocation | kCGGradientDrawsBeforeStartLocation);
CGContextRestoreGState(context);
}
CGContextRestoreGState(context);
}
关于ios - 像 Google Maps Directions 一样绘制 MKMapView Overlay,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8675081/
我有一个带有用于覆盖的 css 类的面板,其中包含一个不应该透明的 div
我已经尝试了 2 天不让 openldap 的 memberof overlay 工作并给出一些实际结果。我的数据库配置: database bdb suffix "dc=exampl
我想使用 jquery ui 弹出一个模式对话框,其中覆盖层是全黑的。我知道我可以在主题中设置它,但我不希望所有对话框都有黑色覆盖。只是其中之一。 有没有办法在每个对话框的基础上配置对话框的背景(覆盖
我是新来的,所以如果我问错了问题或忘记了什么,我先道歉。我尝试了其他问题/答案中的内容,但无法解决我的问题。 我在 div1 上有一个简单的叠加 div2。 div1 里面有一个 svg。 svg 向
我正在使用 npm overlay-navbar 模块创建一个 overlay-navbar https://www.npmjs.com/package/overlay-navbar但是我收到一个错误
我只想为我在 nix 的叠加层中定义的构建应用配置点。 也就是我要设置 permittedInsecurePackages = [ "webkitgtk-2.4.11" ]; 在叠加层中。我
我需要有关如何正确使用 Google Maps API v3 自定义叠加层的 onRemove() 方法的帮助。我在 Google map 上有一个标记,单击该标记时,将显示一个 d3 圆环图,该图将
首先这是我正在使用和尝试做的事情: 此效果的最小设置:flowplayer.org/tools/demos/overlay/index.html 然后是 Apple Leopard 预览效果:flow
我的问题真的很简单...... 想象一张代表您家周围的街道和建筑物的背景图片,请注意这是专门制作的图片。此图像( View )是可缩放的,到目前为止一切都很好。类似于 map ,但使用图像代替。 现在
我正在使用花式框在行内 div 中打开各种编辑功能。我使用ajax获取div内容,将其移动到div中,然后在Fancybox中打开div。大多数情况下效果很好。一些编辑 block 中包含 ckedi
在应用程序中扩展 OSMdroid Overlay 类时 import org.osmdroid.views.overlay.Overlay; ... public class MapOverlayA
我的应用程序有问题,其中包括 osmdroid。每次我尝试在我的设备上运行该应用程序并触摸 map 时,该应用程序都会崩溃,并且出现此错误: 2018-10-02 14:11:45.191 1
我如何在UWP应用程序中实现这样的功能?使用案例:静态图像包含蓝点(覆盖),使用户有机会在蓝点上单击/悬停以了解更多信息。当用户悬停/单击蓝点时,会弹出一个文本来描述图像中的内容。。1)如何在静态图像
仅适用于 iOS:当您将叠加层添加到 Web HTML 用户界面时,您无法通过设置 overflow: hidden on the body 或 html 来阻止底层页面滚动到叠加层之外。这在桌面和
我是 HTML/CSS 新手。我创建了这个侧边栏,当单击时,它会从左侧滑动,滑动时会显示不透明背景。不幸的是,图像显示在不透明覆盖层的顶部,我找不到让它停止在不透明覆盖层上如此明亮地显示的问题。我正在
是否可以创建一个窗口作为另一个窗口的叠加层,例如,您可以在窗口的标题栏或状态栏中显示一个图标? 为了这个问题的目的假设: 该窗口是一个外部窗口(不属于我的应用程序) 叠加层为 16x16 像素并具有透
在 bokeh Holoviews 画廊中,有一个名为“Scatter economic”的示例。 http://holoviews.org/gallery/demos/bokeh/scatter_e
制作 gwt 覆盖类型的深拷贝的最佳方法是什么? 我正在寻找一个函数或库来检查 GWT 覆盖并克隆它。它必须能够克隆包含的数组或对象。 谢谢 最佳答案 我会考虑两种方式。大多数时候覆盖对象与 JSON
最近,我尝试创建一个 Ionic 侧边菜单。我想让侧面菜单覆盖联系人。 但是,我不想推送内容。 --> fu
我正在尝试在另一个正在运行的应用程序上方创建一个覆盖窗口。 让我们说火狐。我通过使用实现 创建窗口 win = XCreateWindow( display, *firefoxwindow,
我是一名优秀的程序员,十分优秀!