怎样绘制UIBezierPath
的UIImageView
?我尝试过以下代码,但是当UIImageView's
图像出现时,nil
我只能看到路径,当我添加图像时,此路径与UIImageView's
图像重叠.我想绘制UIImageVIew's
图像上方的路径.
我实现了一个非常简单的填写使用圆圈UIBezierPath
,然后我转换成UIImage
这样我可以设置到UITableViewCell
的imageView
。这确实很好,但是您可以在Retina显示屏上看到边缘像素化。为什么会那样,怎么做才能确保它看起来很棒?
let colorSize = cell.frame.size.height - 20
let rect = CGRectMake(0, 0, colorSize, colorSize)
UIGraphicsBeginImageContext(rect.size)
let context = UIGraphicsGetCurrentContext()
UIBezierPath(roundedRect: rect, cornerRadius: (colorSize)/2).addClip()
CGContextSetFillColorWithColor(context, UIColor.redColor().CGColor);
CGContextFillRect(context, rect)
var colorImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
cell.imageView?.image = colorImage
Run Code Online (Sandbox Code Playgroud) 我正在编写一个程序,它将取一个介于 0 和 1 之间的数字,然后吐出一个圆(或我猜是圆弧),它完成了那么多。
比如输入0.5,程序会输出一个半圆
如果为 0.1,程序将输出一个很小的小弧,最终将是整个圆的 10%。
我可以通过使角度起点为 0 和角度终点来实现此目的 2*M_PI*decimalInput
但是,我需要在圆的顶部有起点,所以起点是3*M_PI_2
,终点是7*M_PI_2
我只是在用这些新的起点/终点绘制一个部分完整的圆圈时遇到了麻烦。我承认,我的数学不是最好的,所以任何建议/意见都值得赞赏
这是我到目前为止所拥有的
var decimalInput = 0.75 //this number can be any number between 0 and 1
let start = CGFloat(3*M_PI_2)
let end = CGFloat(7*M_PI_2*decimalInput)
let circlePath = UIBezierPath(arcCenter: circleCenter, radius: circleRadius, startAngle: start, endAngle: end, clockwise: true)
circlePath.stroke()
Run Code Online (Sandbox Code Playgroud)
尽管我尝试过,但我似乎无法做到正确。我认为结束角度是罪魁祸首,除非我以错误的方式解决这个问题
在我的应用程序的绘图部分,用户应该能够选择他们创建的路径。UIBezierPath
有一个方便的方法containsPoint:
,在大多数情况下效果很好,但是当绘制的线接近没有曲线的直线时,它会特别糟糕。让你的手指碰到一条直线是非常困难的。
该方法似乎只检查路径上很窄的一条线,即使将lineWidth
路径的属性设置为较大的值也不会影响containsPoint:
测试结果。
我看过类似的问题,比如这个:检测 UIBezierPath 笔触上的触摸,不是填充但无法修改解决方案以查看“路径周围的区域”,它似乎只查看中心的细线其中。
编辑
我提出的一个有效但密集的解决方案是将路径转换为 aUIImage
并在请求的点检查该图像的颜色。如果 alpha 分量大于零,则路径与触摸相交。
这看起来像这样:
// pv is a view that contains our path as a property
// touchPoint is a CGPoint signifying the location of the touch
PathView *ghostPathView = [[PathView alloc] initWithFrame:pv.bounds];
ghostPathView.path = [pv.path copy]; // make a copy of the path
// 40 px is about thick enough to touch reliably
ghostPathView.path.lineWidth = 40;
// the two magic …
Run Code Online (Sandbox Code Playgroud) 我是新手,对我遇到的这个问题感到沮丧.
我想要做的非常简单:在屏幕中央画一条直线并为其制作动画.听起来很简单吧?是啊..这就是我现在所拥有的.
import UIKit
class Drawings: UIView {
override func drawRect(rect: CGRect) {
let screensize: CGRect = UIScreen.mainScreen().bounds
let screenWidth = screensize.width
let screenHeight = screensize.height
//context
let context = UIGraphicsGetCurrentContext()
CGContextSetLineWidth(context, 7.0)
CGContextSetStrokeColorWithColor(context, UIColor.whiteColor().CGColor)
//path
CGContextMoveToPoint(context, screenWidth, screenHeight * 0.5)
CGContextAddLineToPoint(context, screenWidth * 0.5, screenHeight * 0.5)
CGContextSetLineCap(context, CGLineCap.Round)
//draw
CGContextStrokePath(context)
}
}
Run Code Online (Sandbox Code Playgroud)
我问的原因是我发现我无法为它设置动画,因为它在drawRect函数中.真的吗?需要你们的一些解释.谢谢!
如何绘制如图所示的弧,假设我有一个 UIView 作为可移动线的中点。
我在 CGPoint 名称 lineStartPoint 和终点作为 lineEndPoint 存储线的起点。
可以通过名为movingPoint 的CGPoint 访问移动对象。
预先感谢您的帮助。
这是我的Xib.我只是拖了一个UIButton并改变了它的背景颜色.
我使用此代码创建了一个半圆图层
let circlePath = UIBezierPath.init(arcCenter: CGPointMake(mybutton.bounds.size.width / 4, 0), radius: mybutton.bounds.size.height, startAngle: 0.0, endAngle: CGFloat(M_PI), clockwise: true)
let circleShape = CAShapeLayer()
circleShape.path = circlePath.CGPath
mybutton.layer.mask = circleShape
Run Code Online (Sandbox Code Playgroud)
这是我的输出.
它完美,因为我想要它.但问题是这个按钮可以在其圆形区域外点击(根据按钮的实际形状).我希望它只能作为圆形可点击.
我怎样才能做到这一点?谢谢.
有没有办法将起点从ovalInRect 形式的“右”更改为“左”?似乎无论我如何创建它,“起点”总是在“右侧......
let ovalPath = UIBezierPath(ovalInRect: CGRect(x: 515, y: 276.5, width: 280.5, height: 214.5))
let ovalShapeLayer = CAShapeLayer()
ovalShapeLayer.fillColor = UIColor.clearColor().CGColor
ovalShapeLayer.strokeColor = UIColor.lightGrayColor().CGColor
ovalShapeLayer.lineWidth = 1.5
ovalShapeLayer.path = ovalPath.CGPath
self.view.layer.insertSublayer(ovalShapeLayer, atIndex: 1)
Run Code Online (Sandbox Code Playgroud)
谢谢
我想使用UIBazierpath
渐变色填充圆的一半边框。
最初我尝试使用完整的圆圈但它不起作用,渐变总是填充圆圈而不是边框。有没有办法做到这一点?
这是我到目前为止所拥有的:
let path = UIBezierPath(roundedRect: rect, cornerRadius: rect.width/2)
let shape = CAShapeLayer()
shape.path = path.cgPath
shape.lineWidth = 2.0
shape.strokeColor = UIColor.black.cgColor
self.layer.addSublayer(shape)
let gradient = CAGradientLayer()
gradient.frame = path.bounds
gradient.colors = [UIColor.magenta.cgColor, UIColor.cyan.cgColor]
let shapeMask = CAShapeLayer()
shapeMask.path = path.cgPath
gradient.mask = shapeMask
shapeMask.lineWidth = 2
self.layer.addSublayer(gradient)
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用提供的 UIBezierPath 创建一个 UIImage。不幸的是,无论我设置什么setLineWidth
,结果总是 1 分:
extension UIBezierPath {
func image(fillColor: UIColor, strokeColor: UIColor) -> UIImage? {
UIGraphicsBeginImageContextWithOptions(bounds.size, false, 1.0)
guard let context = UIGraphicsGetCurrentContext() else {
return nil
}
context.setLineWidth(10)
context.setFillColor(fillColor.cgColor)
context.setStrokeColor(strokeColor.cgColor)
self.fill()
self.stroke()
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
Run Code Online (Sandbox Code Playgroud)
在一个带有圆圈的测试项目中尝试这个,例如:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let imageView = UIImageView()
imageView.frame = CGRect(x: 100, y: 100, width: 100, height: 100)
view.addSubview(imageView)
let bezierPath = UIBezierPath(ovalIn: CGRect(x: 0, y: 0, width: …
Run Code Online (Sandbox Code Playgroud) uibezierpath ×10
ios ×7
swift ×6
objective-c ×3
cgcontext ×2
swift2 ×2
cashapelayer ×1
cocoa-touch ×1
drawrect ×1
gradient ×1
uiimage ×1
uiimageview ×1