2016-01-13 30 views
2

我并没有任何关于在Swift中绘制的知识,但我期望创建与正方形略有不同的部分应用背景。见下图什么,我试图让:如何在Swift中创建独特的形状或UIViews

enter image description here

的想法是,这将坐在屏幕的顶部,而只不过是一个背景了。它会延伸到屏幕的一半。然后,我会在顶部添加一个图像等。我需要在广场底部的点始终坐在屏幕中间。

我可以通过代码在Swift中创建此形状/ UIView吗?如果是这样,怎么样?

或者,将它作为图像创建并做到这一点比较好吗?

回答

11

我可以通过代码在Swift中创建此形状/ UIView吗?如果是这样,怎么样?

视图总是矩形的,但视图的内容可以是任何形状,它的背景可以是透明的,因此视图的可见部分可以是任何可以绘制的视图。

还有很多在iOS中绘制东西的方法。通常最好从最适合您的最高级别的工具开始,并在需要更多控制时降低到较低的级别。考虑到这一点,我建议先创建一个视图,使用UIBezierPath绘制您的五角形。该代码,这是非常简单的:

class PentagonView : UIView { 
    override init(frame: CGRect) { 
     super.init(frame: frame) 
     backgroundColor = UIColor.clearColor() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     backgroundColor = UIColor.clearColor() 
    } 

    override func drawRect(rect: CGRect) { 
     let size = self.bounds.size 
     let h = size.height * 0.85  // adjust the multiplier to taste 

     // calculate the 5 points of the pentagon 
     let p1 = self.bounds.origin 
     let p2 = CGPoint(x:p1.x + size.width, y:p1.y) 
     let p3 = CGPoint(x:p2.x, y:p2.y + h) 
     let p4 = CGPoint(x:size.width/2, y:size.height) 
     let p5 = CGPoint(x:p1.x, y:h) 

     // create the path 
     let path = UIBezierPath() 
     path.moveToPoint(p1) 
     path.addLineToPoint(p2) 
     path.addLineToPoint(p3) 
     path.addLineToPoint(p4) 
     path.addLineToPoint(p5) 
     path.closePath() 

     // fill the path 
     UIColor.redColor().set() 
     path.fill() 
    } 
} 

现在你可以在你的用户界面的任何地方使用该视图: PentagonView

如果你想一个150x150px PentagonView坐标添加到您的视图控制器的主视图( 100,200),你可以把在viewDidLoad()如下:

let pg = PentagonView(frame:CGRect(100, 200, 150, 150)) 
self.view.addSubview(pg) 

或者,你还可以添加一个PentagonView在你的故事板视图的一些通过在下降3210的大小,然后将其更改为PentagonView

或者,只是将其作为图像创建并以此种方式进行创建会更好吗?

如果你已经完全描述了你的需求,那么不,我不这么认为:图像本身可能比绘制它的代码大得多,以及我上面给出的代码将以您选择的任何尺寸工作。另一方面,如果您要添加大量复杂的细节,并且图像只需要以一种尺寸显示,那么在绘图程序中创建一次并将其存储为图像可能会更容易。就像我上面所说的那样,iOS中有很多绘图选项。你选择的应该由你的需求决定。

+0

感谢您的支持!我可以理解每一步,感谢评论!我创建了一个新的.Swift文件,然后添加了代码,然后在VC的.Swift文件中,在'viewDidLoad'方法中,我添加了'let BG = PentagonView(frame:CGRect(origin:CGPoint(),size:CGSize宽度:250,高度:250)))' - 但是当我运行该应用程序,没有任何显示。 Xcode没有错误,只是没有显示。 – Nick89

+0

@ Nick89对不起,如果这还不清楚 - 我在操场上面写了上面的代码,在那里你真的需要做的是看到结果是实例化视图。要在应用程序中使用,您需要在某处创建一个PentagonView实例,然后将其添加到视图层次结构中。要做到这一点,最简单的方法可能就是在您的故事板中的一个视图中放置一个“PentagonView”,如果您使用的话。 – Caleb

+0

嗨,对不起,我没有遵循:(我从来没有做过任何绘制明智之前,所以努力如何设置这个。我将代码添加到一个名为'CreateShape.swift'的新文件,我需要添加它我的看法控制器,它有一个连接到它的文件,名为'mainVC.swift'。你能帮我在代码中告诉我如何设置它:我想用绘图做更多的事情,所以很想知道如何去做它!预先感谢 – Nick89

0

如果您从形状文件中将图像加载到UIImageView上,可能是最好的,尤其是如果它只是背景。然后,您可以将视图的底部限制到应用程序的中间位置。不过,您也可以对视图的CALayer属性进行一些调整,以实现您的效果。

+1

使用图片时,您必须为不同的屏幕尺寸和分辨率维护资产的不同版本。这在代码中很容易完成,并完全避免了这个问题。 –

+0

@NoahWitherspoon我会争辩说,像这样一个完全红色的形状可以合理地缩小,而Xcode本身没有太多的质量损失。 – MiddaPhofidda

0

解决此问题的最佳方法不是创建视图(UIView),而是创建图层(CAShapeLayer)。你可以从一个路径创建一个CAShapeLayer,从而用矢量描述你的形状(而不是位图)。

有很多关于CAShapeLayer的教程会告诉你实现这个的代码。