ios - 在 Swift 中从 ViewController 更改 UIView 变量

标签 ios swift uiview

我最近一直在 Swift 上磕磕绊绊,遇到了一个我认为我理解的概念,但似乎无法让它正常工作。

在我的应用程序中,我有一个 ViewController,其中包含我在 IB 中添加的 View 。我已将 View 的自定义类设置为“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()
}
}

如有任何想法,我们将不胜感激。谢谢!

最佳答案

我将借助以下示例对此进行解释,其中我有一个简单的 View ,其中包含一个 UIImageView,稍后我想从 ViewController 设置它的图像。以下代码用于 View -

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函数来改变图片。希望能帮助到你。

关于ios - 在 Swift 中从 ViewController 更改 UIView 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31214885/

相关文章:

objective-c - iOS - 如何检测两个或多个对象是否发生碰撞

ios - 使用alamofire 2.0和Swift 2.0的POST请求

objective-c - rootViewController 的 self.view 和 self.view .superview 有什么区别?

iphone - 从 UIViewController 加载 UINavigationController 作为 subview

ios - 在 Objective-c 中在不占用内存的情况下对 block 进行动画处理

ios - Sprite Kit didBeginContact 未在 body 和 edgeRect 之间调用

swift - 使用 swift 4 为数组从远程 url 检索 json 数据的正确方法

ios - 自动布局多个 UITextviews 和标签 - Swift

iOS - 在 Localizable.strings 中用粗体字符串强调

iphone - 使 UIView 变暗