Ios UIBezierpath未绘制平滑图像
我想在swift中创建一个自定义按钮,结果不是很令人满意。UIBezierpath未绘制平滑路径。请参阅下面的图片和代码Ios UIBezierpath未绘制平滑图像,ios,swift,uibezierpath,Ios,Swift,Uibezierpath,我想在swift中创建一个自定义按钮,结果不是很令人满意。UIBezierpath未绘制平滑路径。请参阅下面的图片和代码 let roundRect = UIBezierPath(roundedRect: CGRectMake(0, 0, 156, 60), byRoundingCorners:.AllCorners, cornerRadii: CGSizeMake(200, 200)) 在玩了一会儿之后,我发现将路径向下和向右移动1点并将矩形大小缩小1可以解决问题。但我不喜欢这个解决方案,
let roundRect = UIBezierPath(roundedRect: CGRectMake(0, 0, 156, 60), byRoundingCorners:.AllCorners, cornerRadii: CGSizeMake(200, 200))
在玩了一会儿之后,我发现将路径向下和向右移动1点并将矩形大小缩小1可以解决问题。但我不喜欢这个解决方案,我认为这不是正确的方法。我觉得画面在剪辑我的图像。有人能帮我吗
let roundRect = UIBezierPath(roundedRect: CGRectMake(1, 1, 154, 59), byRoundingCorners:.AllCorners, cornerRadii: CGSizeMake(200, 200))
整个CustomButton子类:
import UIKit
class DesignableButtons: UIButton {
let black = UIColor(red: 33/255, green: 33/255, blue: 33/255, alpha: 1.0) /* #212121 */
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
self.setTitle("Go to Google", forState: UIControlState.Normal)
self.titleLabel!.font = UIFont(name: "GT Walsheim", size: 14)
self.setTitleColor(black, forState: .Normal)
self.setTitleColor(UIColor.whiteColor(), forState: .Highlighted)
self.setTitleColor(UIColor.whiteColor(), forState: .Selected)
self.titleLabel!.alpha = 1.0
}
let roundRect = UIBezierPath(roundedRect: CGRectMake(0, 0, 156, 60), byRoundingCorners:.AllCorners, cornerRadii: CGSizeMake(200, 200))
override func drawRect(rect: CGRect) {
black.setStroke()
roundRect.stroke()
if highlighted {
black.setFill()
roundRect.fill()
}
}
override var highlighted: Bool {
didSet {
setNeedsDisplay()
}
}
}
试试这个
let roundRect = UIBezierPath(roundedRect: CGRectInset(CGRectMake(0, 0, 156, 60), 1, 1), byRoundingCorners:.AllCorners, cornerRadii: CGSizeMake(200, 200))
已编辑
或者,您也可以这样做以使其更具可重用性,这可以在您的layoutSubviews
let roundRect = UIBezierPath(roundedRect: CGRectInset(self.frame, 1, 1), byRoundingCorners:.AllCorners, cornerRadii: CGSizeMake(200, 200))
而不是
let roundRect = UIBezierPath(roundedRect: CGRectMake(0, 0, 156, 60), byRoundingCorners:.AllCorners, cornerRadii: CGSizeMake(200, 200))
CGRectInset
函数在原始rect中创建一个rect
返回小于或大于源的矩形
矩形,具有相同的中心点
已编辑
您可以将其放入init
中,以解决可视化问题
self.contentScaleFactor = UIScreen.mainScreen().scale //SUPPORT RETINA
我希望这能帮助你你有问题,因为线路被剪断了。当您绘制到drawRect:时,这种情况总是发生。尝试在外部绘制drawRect: 例如:
required init?(coder aDecoder: NSCoder) {
// some code
layer.masksToBounds = true
layer.cornerRadius = 200
layer.borderWidth = 1
layer.borderColor = black.CGColor
}
或者,如果要使用子层:
let borderLine = CAShapeLayer()
required init?(coder aDecoder: NSCoder) {
// some code
frame = someFrame
let roundRect = UIBezierPath(roundedRect: CGRectMake(0, 0, 156, 60), byRoundingCorners:.AllCorners, cornerRadii: CGSizeMake(200, 200))
borderLine.path = roundRect.CGPath
borderLine.frame = bounds
borderLine.strokeColor = black.CGColor
borderLine.fillColor = UIColor.clearColor().CGColor
borderLine.lineWidth = 1
layer.insertSublayer(borderLine, atIndex: 0)
}
你能把你所有的图纸代码都贴出来吗?此外,这会在物理设备上重现吗?有时,如果未缩放到100%,则会在模拟器上发生这种情况。是的,在我的物理iphone6上也会发生同样的情况。
覆盖func drawRect
否。不允许覆盖UIButton的drawRect
。您需要构建一个背景图像,设置按钮的背景图像,让它以自己的方式绘制。谢谢您的帮助!我查看了CGRectInset的文档,它的作用是缩小/扩大矩形的大小。在这种情况下,将其缩小1点不会产生很大的差异。然而,这意味着它不是完全相同的尺寸,在生产时不会被接受。是你的贝塞尔路径被修改了,而不是原来的按钮,你的意思是“在生产时不会被接受。”?我的意思是,在公司设置中,要与设计团队合作,UI需要像素精确。设计团队有时可能不接受将按钮缩小1像素的做法。我告诉过您,我们不会修改按钮大小,只会修改UIBezierPath以制作边框,您的按钮大小相同;),如果这个答案解决了你的问题,你能标记为接受吗?对不起,雷尼尔,我可能很烦人。我知道您的代码不会修改按钮大小,但它会修改按钮的外观。这就是我所说的,你正在改变这里的设计。我试图寻找一种方法,使它显示正确,而不收缩按钮的外观。如果真的没有办法,我会接受你的回答。再次非常感谢您!:)绝对地如果您使用这个'self.contentScaleFactor=UIScreen.mainScreen().scale'处理drawRect,我已经更新了我的答案