【发布时间】:2018-07-05 08:08:05
【问题描述】:
我正在开发一款 iOS 棋盘游戏。我试图给董事会一种“质感”。
我所做的是我创建了这个非常小的图像(真的很小,一定要仔细看):
我将此图像传递给UIColor.init(patternImage:) 初始化程序以创建一个UIColor 即此图像。我用这个UIColor填充了一些正方形UIBezierPaths,结果是这样的:
该图像的所有副本都完美排列,并形成许多对角直线。到目前为止一切顺利。
现在在 iPad 上,我画的方块会变大,而且这些方块的边框也会变大。我已经成功计算出正方形的笔画宽度和大小应该是多少,所以这不是问题。
但是,由于 iPad 上的正方形更大,每个正方形的对角线会更多。我不要那个。我需要将非常小的图像调整为更大的图像,并且大小取决于正方形的笔画宽度。具体来说,调整后图片的宽度应该是笔划宽度的两倍。
我写了这个扩展来调整图像大小,改编自post:
extension UIImage {
func resized(toWidth newWidth: CGFloat) -> UIImage {
let scale = newWidth / size.width
let newHeight = size.height * scale
UIGraphicsBeginImageContextWithOptions(CGSize(width: newWidth, height: newHeight), false, 0)
self.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
}
并这样称呼它:
// this is the code I used to draw a single square
let path = UIBezierPath(rect: CGRect(origin: point(for: Position(x, y)), size: CGSize(width: squareLength, height: squareLength)))
UIColor.black.setStroke()
path.lineWidth = strokeWidth
// this is the line that's important!
UIColor(patternImage: #imageLiteral(resourceName:
"纹理").resized(toWidth: strokeWidth * 2)).setFill() path.fill() path.stroke()
现在游戏板在 iPhone 上是这样的:
您可能需要将网页放大一点才能明白我的意思。董事会现在看起来非常难看。您可以看到图像的每个副本的“边框”。我不想要这个。不过,在 iPad 上,电路板看起来不错。我怀疑这只会在我缩小图像时发生。
我认为这可能是由于我使用扩展程序时发生的抗锯齿。我发现this post 和this post 关于删除抗锯齿,但前者似乎在图像视图中执行此操作,而我在自定义GameBoardView 的draw(_:) 方法中执行此操作。后者的解决方案似乎和我使用的完全一样。
如何在没有抗锯齿的情况下调整大小?或者在更高的抽象层次上,我怎样才能让我的电路板看起来很漂亮?
【问题讨论】:
标签: ios swift drawing image-resizing