如何在 iOS 设备上以编程方式在 UIImageView 后面显示彩色磁盘

how to programmatically show a colored disk behind a UIImageView, in swift on an iOS device

提问人:Doug Null 提问时间:5/20/2021 最后编辑:Doug Null 更新时间:5/29/2021 访问量:81

问:

我有一个以编程方式显示的图标。
如何在同一屏幕位置的图标后面显示一个纯色的彩色圆盘?

图标不透明。

我有时会以编程方式更改屏幕位置以及磁盘的直径和颜色。

以下是我现在以编程方式显示图标的方式.............

DispatchQueue.main.async
{

       ViewController.wrist_band_UIImageView.frame = CGRect(   x: screen_position_x, 
                                                               y: screen_position_y,
                                                               width: App_class.screen_width,
                                                               height: App_class.screen_height)
}

D.Mika 的更新 #1 如下...enter image description here

D.Mika 的更新 #2 如下...

import UIKit
            import Foundation


class ViewController: UIViewController 
{
    static var circleView: UIView!

    static let wrist_band_UIImageView: UIImageView = {
       let theImageView = UIImageView()
       theImageView.image = UIImage( systemName: "applewatch" )
       theImageView.translatesAutoresizingMaskIntoConstraints = false 
       return theImageView
    }()

    override func viewDidLoad()     
    {
            super.viewDidLoad()

            view.addSubview( ViewController.wrist_band_UIImageView )
        // Init disk image:
        ViewController.circleView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))
        ViewController.circleView.backgroundColor = .red
        ViewController.circleView.layer.cornerRadius = view.bounds.size.height / 2.0
        ViewController.circleView.clipsToBounds = true
            // Add view to view hierarchy below image view
        ViewController.circleView.insertSubview(view, belowSubview: ViewController.wrist_band_UIImageView)


        App_class.display_single_wearable()
    }
 }

 class App_class
 {
    static var is_communication_established = false
    static var total_packets = 0

    static func display_single_wearable()
    {
                ViewController.wrist_band_UIImageView.frame = CGRect(x: 0, y: 0,
                                                                      width: 100, height: 100)

                ViewController.circleView.frame = CGRect(   x: 0,
                                             y: 0,
                                             width: 100,
                                             height: 100)
                ViewController.circleView.layer.cornerRadius = 100
    }

    static func process_location_xy(text_location_xyz: String)
    {}
} // App_class

enter image description here

iOS Swift Objective-C UIImageView

评论

0赞 aheze 5/20/2021
取决于,您是使用约束还是设置框架?
1赞 Doug Null 5/21/2021
aheze:就是代码里的内容。仅限编程方式。没有布局。没有IB。
0赞 D. Mika 5/21/2021
替换为ViewController.circleView.insertSubview(view, belowSubview: ViewController.wrist_band_UIImageView)view.insertSubview(ViewController.circleView, belowSubview: ViewController.wrist_band_UIImageView)

答:

-1赞 D. Mika 5/20/2021 #1

您可以使用以下视图显示彩色圆圈:

circleView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 100.0, height: 100.0))
circleView.backgroundColor = .red
circleView.layer.cornerRadius = view.bounds.size.height / 2.0
circleView.clipsToBounds = true
// Add view to view hierarchy below image view
view.insertSubview(circleView, belowSubview: wrist_band_UIImageView)

您可以通过应用新框架来更改它的位置和大小。但是您必须相应地更改图层的 cornerRadius。

这是 Playground 中的一个简单示例:Playground sample

编辑: 我修改了示例代码以添加视图层次结构。 但是,当您修改图像视图的框架时,您仍然需要调整圆的框架。(以及相应的 cornerRadius)。例如

DispatchQueue.main.async
{
    
    ViewController.wrist_band_UIImageView.frame = CGRect(   x: screen_position_x,
                                                            y: screen_position_y,
                                                            width: App_class.screen_width,
                                                            height: App_class.screen_height)
    circleView.frame = CGRect(   x: screen_position_x,
                                 y: screen_position_y,
                                 width: App_class.screen_width,
                                 height: App_class.screen_height)
    circleView.layer.cornerRadius = App_class.screen_width
}

你需要向 viewController 添加一个变量,用于保存对圆形视图的引用,例如:

var circleView: UIView!

评论

0赞 Duncan C 5/20/2021
设置显式框架仅在第一次触发 AutoLayout 并更新视图控制器中所有视图的布局之前有效。将布局锚点添加到设置其布局约束的彩色视图要安全得多。
0赞 Doug Null 5/20/2021
我没有使用自动布局。
0赞 Doug Null 5/20/2021
我将代码粘贴到 viewDidLoad() 的末尾,但没有任何显示。
0赞 D. Mika 5/20/2021
这只是如何创建显示彩色圆圈的 UIView 的示例。它不对使用哪种布局做出任何假设,也不会将此视图插入到视图层次结构中。
1赞 D. Mika 5/29/2021
@DougNull:如果你觉得被侮辱了,我很抱歉。但是您的回答或评论的内容表明存在知识差距。由于英语不是我的母语,可能是措辞错误。
-1赞 Doug Null 5/29/2021 #2

以下答案有效。

上面 d.mika 的答案不起作用。另外,他是侮辱性的。;-)

// Show red circle
    let circlePath = UIBezierPath(arcCenter: CGPoint(x: 200, y: 400), radius: CGFloat(40), startAngle: CGFloat(0), endAngle: CGFloat(Double.pi * 2), clockwise: true)
    
    let shapeLayer = CAShapeLayer()
    shapeLayer.path = circlePath.cgPath
    
    // Change the fill color
    shapeLayer.fillColor = UIColor.red.cgColor
    // You can change the stroke color
    shapeLayer.strokeColor = UIColor.red.cgColor
    // You can change the line width
    shapeLayer.lineWidth = 3.0
    
    view.layer.addSublayer(shapeLayer)