- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试通过扩展类 UIView 来创建自定义 View ,该类可以在自定义 View 的中心显示一个圆圈。为了添加自定义绘图,我重写了 draw(_ rect: CGRect) 方法,如下所示。
public override func draw(_ rect: CGRect) {
super.draw(rect)
let center = CGPoint(x: bounds.width / 2, y: bounds.height / 2)
let minLength = bounds.width <= bounds.height ? bounds.width : bounds.height
let circlePath = UIBezierPath (arcCenter: center, radius: CGFloat(minLength / 2), startAngle: 0, endAngle: CGFloat(Float(360).degreesToRadians) , clockwise: true)
let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath
shapeLayer.fillColor = circleColor.cgColor
layer.addSublayer(shapeLayer)
}
但是当我尝试在 Storyboard 中添加相同的自定义组件并在 draw 方法中添加断点时,它没有被调用。出于好奇,我在被调用的 init?(coder aDecoder: NSCoder) 方法中添加了一个断点。此外,当我尝试如下重写该方法时,它工作正常。
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
drawCircle()
}
fileprivate func drawCircle() {
let center = CGPoint(x: bounds.width / 2, y: bounds.height / 2)
let minLength = bounds.width <= bounds.height ? bounds.width : bounds.height
let circlePath = UIBezierPath (arcCenter: center, radius: CGFloat(minLength / 2), startAngle: 0, endAngle: CGFloat(Float(360).degreesToRadians) , clockwise: true)
let shapeLayer = CAShapeLayer()
shapeLayer.path = circlePath.cgPath
shapeLayer.fillColor = circleColor.cgColor
layer.addSublayer(shapeLayer)
}
方法的问题是我有一个自定义属性 circleColor
@IBInspectable
public var circleColor : UIColor = UIColor.gray
在调用init方法时还没有设置,它总是画一个灰色的圆圈。
请帮助让我知道未调用 draw 方法的原因。
提前致谢
最佳答案
我不确定你的根本错误在哪里,但你不应该为了添加一个层而覆盖 draw(:)
。这意味着每次组件重新渲染时都会再次添加一个新层。这不是你想要的。
您还应该确保在更改颜色属性时更新图层颜色。为此,只需保存对图层的引用:
private let shapeLayer = CAShapeLayer()
@IBInspectable
public var circleColor : UIColor = UIColor.gray {
didSet {
shapeLayer.fillColor = circleColor.cgColor
}
}
public override init(frame: CGRect = .zero) {
super.init(frame: frame)
updateLayer()
layer.addSublayer(shapeLayer)
}
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
updateLayer()
layer.addSublayer(shapeLayer)
}
fileprivate func updateLayer() {
let center = CGPoint(x: bounds.width / 2, y: bounds.height / 2)
let minLength = min(bounds.width, bounds.height)
let circlePath = UIBezierPath(arcCenter: center, radius: minLength / 2, startAngle: 0, endAngle: CGFloat(Float(360).degreesToRadians), clockwise: true)
shapeLayer.path = circlePath.cgPath
shapeLayer.fillColor = circleColor.cgColor
}
override func layoutSubviews() {
super.layoutSubviews()
// update layer position
updateLayer()
}
如果你真的想覆盖draw(rect:)
,你根本不需要创建层或覆盖初始值设定项:
@IBInspectable
public var circleColor : UIColor = UIColor.gray {
didSet {
setNeedsDisplay()
}
}
public override func draw(_ rect: CGRect) {
// no need to call super.draw(rect)
let center = CGPoint(x: bounds.width / 2, y: bounds.height / 2)
let minLength = min(bounds.width, bounds.height)
let circlePath = UIBezierPath(arcCenter: center, radius: minLength / 2, startAngle: 0, endAngle: .pi * 2, clockwise: true)
// the following methods use current CGContext
circleColor.set()
circlePath.fill()
}
关于ios - 画(_直角: CGRect) not getting called in custom view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48725671/
我是 iPhone 编程的新手,目前正在开发 ballsplit 游戏。在这个游戏中,当我的子弹击中任何球时,我希望它产生两个新球。我的子弹和球都是uiimageview。 这是我的代码: if ((
有人对以下任务有好的解决方案吗? 我需要检查一个 CGRect 是否在另一个 CGRect 内部并返回一个 CGPoint,如果矩形窗口在包含的任何维度之外,它会给出偏移量。 提前致谢 最佳答案 Sw
我有一个 CGRect ,我想用 UIEdgeInsets 调整它. 似乎可能有一个内置函数可以做到这一点。我找了一个 CGRectAdjustByInsets或与其他一些功能一起使用 CGRect…
我正在尝试在 UITextField 中移动文本使其垂直对齐正确。我在网上搜索过,一切都指向编辑这些方法: - (CGRect) textRectForBounds:(CGRect)bounds 和
如何创建UnsafePointer?尝试让 mediaBoxPtr = UnsafePointer(mediaBox) 但失败了 func PDFImageData(filter: QuartzFil
在初始化 CGRect 之前,我试图查看 CGRect 是否与数组中的任何其他 CGRect 相交,但我我还没有找到有效的万无一失的方法。 请注意,交集是 CGRect 的数组。任何关于如何做到这一点
@interface some_class : some_parent { } @property (nonatomic, assign) CGRect the_rect; @end ... @im
当我使用 ReactiveCocoa 时,我想观察我的 tableView 的框架,但是出现了一个问题: __block CGRect tmp_rect; [RACObserve(self, self
我在 View 上放置了一个标签, View 的框架是CGRectMake(0,0,270,203)。现在我必须使用 CGRectMake(0,0,800,600) 截取 View 。所以我必须将标签
如何从另一个中减去一个 CGRect?我希望结果 R1 - R2 是不与 R2 相交的 R1 的最大子矩形。 示例 1: +----------------------------------+| +
大家好,我要问一个基本问题,我搜索了很多链接来解决我的问题,但没有一个没有给出确切的结果。这是我的问题: 我想传递矩形值并使用某种转换返回相同的类型,因为我编写了一种方法,但它给了我错误,我知道它可能
如何使用此方法 - (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 我
看来错误的真正原因是我试图将 Double 乘以 CGFloat。我花了一段时间通过实验才理解这一点,并更新了我的代码以使用下面 v3 的等效项,但我仍然想理解错误消息。 class MyView:
我一直断断续续地使用那种方法,但从未真正理解它们的行为方式。 每次我尝试使用它们时,我发现自己在尝试不同的方面时陷入黑暗,而且它似乎从来没有达到我期望的效果。 为了争论,我正在尝试转换从 UIKeyb
我尝试子类化 UITextField 来绘制自定义占位符。在 iOS 6 中,这工作正常,但在 iOS 7 中,我得到了不同的 CGRect 高度。 UITextField 框架是(0, 0, 500
我是 iOS 编程新手。 我正在阅读一本指南,一本意大利语版的 iOS 书籍。对于第一个应用程序,我必须像这样修改 ViewController.m: #import "ViewController.
我想将 UITableView 中 UITableViewCell subview 中对象的 CGRect “aRect” 转换为 CGRect 相对于 self.view。 问题是 aRect 是相
我试图拖动CGRect,但没有任何反应。矩形保留在同一个地方。这是我的 mouseDragged: 代码: -(void)mouseDragged:(NSEvent *)theEvent{ NSPoi
我正在声明一个按钮: let button = UIButton(frame: CGRect(x: ?, y: ?, width: 50, height: 50)) 但我记下了如何设置 x和 y相对于
我正在声明一个按钮: let button = UIButton(frame: CGRect(x: ?, y: ?, width: 50, height: 50)) 但我记下了如何设置 x和 y相对于
我是一名优秀的程序员,十分优秀!