我最近和Swift一直磕磕绊绊,并且遇到了一个我认为我理解的概念,但似乎无法让它正常工作。
在我的应用程序中,我有一个ViewController,其中包含我在IB中添加的View。我已将我的View的Custom Class设置为“RingView”,它存在于我的RingView.swift文件中(对于上下文,RingView绘制一个环)。
这在技术上工作正常,因为我在运行应用程序时正确呈现了我的铃声。我要做的是从我的ViewController.swift文件中以编程方式设置环的线宽和笔触颜色。虽然我在构建时没有收到任何错误,但是我将lineWidth设置为10,例如,当我构建时,行的宽度始终为1。
RingView.swift
class RingView: UIView {
var lineWidth: CGFloat = 1
var strokeColor = UIColor(red: 147.0/255.0, green: 184.0/255.0, blue: 255.0/255.0, alpha: 1.0).CGColor
let circlePathLayer = CAShapeLayer()
let circleRadius: CGFloat = 105.0
override init(frame: CGRect) {
super.init(frame: frame)
configure()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
configure()
}
func configure() {
circlePathLayer.frame = bounds
circlePathLayer.lineWidth = lineWidth
circlePathLayer.fillColor = UIColor.clearColor().CGColor
circlePathLayer.strokeColor = strokeColor
layer.addSublayer(circlePathLayer)
backgroundColor = UIColor.clearColor()
}
func circleFrame() -> CGRect {
var circleFrame = CGRect(x: 0, y: 0, width: 2*circleRadius, height: 2*circleRadius)
circleFrame.origin.x = CGRectGetMidX(circlePathLayer.bounds) - CGRectGetMidX(circleFrame)
circleFrame.origin.y = CGRectGetMidY(circlePathLayer.bounds) - CGRectGetMidY(circleFrame)
return circleFrame
}
func circlePath() -> UIBezierPath {
return UIBezierPath(ovalInRect: circleFrame())
}
override func layoutSubviews() {
super.layoutSubviews()
circlePathLayer.frame = bounds
circlePathLayer.path = circlePath().CGPath
}
}
ViewController.swift
import UIKit
class ViewController: UIViewController {
@IBOutlet var titleLabel: UILabel!
@IBOutlet weak var RingViewInner: RingView!
var detailItem: Minion? {
didSet {
// Update the view.
self.configureView()
}
}
func configureView() {
// Update the user interface for the detail item.
if let detail = self.detailItem {
//Set the label for the title name
if let label = titleLabel {
label.text = detail.title!
}
}
}
override func viewDidLoad() {
super.viewDidLoad()
RingViewInner?.strokeColor = UIColor(red: 255.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: 0.0).CGColor
RingViewInner?.lineWidth = 10
RingViewInner.setNeedsDisplay()
//Show the configured context of data
self.configureView()
}
}
任何想法都会非常感激。谢谢!
答案 0 :(得分:1)
我将在下面的示例的帮助下解释这一点,其中我有一个简单的视图,里面有一个UIImageView,后来我想从ViewController设置它的图像。以下代码用于视图 -
class ImagePreviewView: UIView {
var imgView: UIImageView!
var img: UIImage!
override init(frame: CGRect) {
super.init(frame: frame)
imgView=UIImageView(frame: CGRect(x: 0, y: 0, width: self.frame.width, height: self.frame.height))
imgView.contentMode = .scaleAspectFit
self.addSubview(imgView)
}
func setImage(img: UIImage){
self.imgView.image=img
}
override func didMoveToSuperview() {
self.backgroundColor=UIColor.black
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
现在是ViewController的代码
class ViewController: UIViewController {
override func viewDidLoad() {
imagePreviewView = ImagePreviewView(frame: CGRect(x: self.view.frame.width, y: 0, width: self.view.frame.width-sideStripWidth, height: self.view.frame.height-140))
self.view.addSubview(imagePreviewView)
}
//call this function to set image of imagePreviewView
func changeImage(img){
imagePreviewView.setImage(img: img)
}
}
changeImage函数调用imagePreviewView中的setImage函数来更改图像。希望能帮助到你。
答案 1 :(得分:0)
你可以将变量设为全局变量,例如你可以把它放在“ViewController”类的旁边