Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios UIBezierpath未绘制平滑图像_Ios_Swift_Uibezierpath - Fatal编程技术网

Ios 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可以解决问题。但我不喜欢这个解决方案,

我想在swift中创建一个自定义按钮,结果不是很令人满意。UIBezierpath未绘制平滑路径。请参阅下面的图片和代码

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,我已经更新了我的答案