当前位置: 首页 > 面试题库 >

如何在带有Swift的iOS 8上显示带有文本的活动指示器?

束俊材
2023-03-14
问题内容

我想以编程方式显示带有文本的活动指示器,例如“照片”应用中的活动指示器(在编辑和保存图片之后)。我怎样才能做到这一点?

在此处输入图片说明


问题答案:

Xcode 8.2.1•Swift 3.0.2

import UIKit

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var filterButton: UIButton!
    @IBOutlet weak var saveButton: UIButton!

    let destinationUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
        .appendingPathComponent("filteredImage.png")
    let imagePicker = UIImagePickerController()
    let messageFrame = UIView()
    var activityIndicator = UIActivityIndicatorView()
    var strLabel = UILabel()

    let effectView = UIVisualEffectView(effect: UIBlurEffect(style: .dark))

    func activityIndicator(_ title: String) {

        strLabel.removeFromSuperview()
        activityIndicator.removeFromSuperview()
        effectView.removeFromSuperview()

        strLabel = UILabel(frame: CGRect(x: 50, y: 0, width: 160, height: 46))
        strLabel.text = title
        strLabel.font = .systemFont(ofSize: 14, weight: UIFontWeightMedium)
        strLabel.textColor = UIColor(white: 0.9, alpha: 0.7)

        effectView.frame = CGRect(x: view.frame.midX - strLabel.frame.width/2, y: view.frame.midY - strLabel.frame.height/2 , width: 160, height: 46)
        effectView.layer.cornerRadius = 15
        effectView.layer.masksToBounds = true

        activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .white)
        activityIndicator.frame = CGRect(x: 0, y: 0, width: 46, height: 46)
        activityIndicator.startAnimating()

        effectView.addSubview(activityIndicator)
        effectView.addSubview(strLabel)
        view.addSubview(effectView)
    }

    func saveImage() {
        do {
            try imageView.image?.data?.write(to: destinationUrl, options: .atomic)
            print("file saved")
        } catch {
            print(error)
        }
    }

    func applyFilterToImage() {
        imageView.image = imageView.image?.applying(contrast: 1.5)
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        guard let url = URL(string: "https://upload.wikimedia.org/wikipedia/commons/a/a8/VST_images_the_Lagoon_Nebula.jpg"), let data = try? Data(contentsOf: url), let image = UIImage(data: data) else { return }
        view.backgroundColor = UIColor(white: 0, alpha: 1)
        imageView.image = image
    }

    @IBAction func startSavingImage(_ sender: AnyObject) {
        saveButton.isEnabled = false
        filterButton.isEnabled = false
        activityIndicator("Saving Image")
        DispatchQueue.main.async {
            self.saveImage()
            DispatchQueue.main.async {
                self.effectView.removeFromSuperview()
                self.saveButton.isEnabled = true
                self.filterButton.isEnabled = true
            }
        }
    }

    @IBAction func filterAction(_ sender: AnyObject) {
        filterButton.isEnabled = false
        saveButton.isEnabled = false
        activityIndicator("Applying Filter")
        DispatchQueue.main.async {
            self.applyFilterToImage()
            DispatchQueue.main.async {
                self.effectView.removeFromSuperview()
                self.filterButton.isEnabled = true
                self.saveButton.isEnabled = true
            }
        }
    }

    @IBAction func cameraAction(_ sender: AnyObject) {
        if UIImagePickerController.isSourceTypeAvailable(.camera) {
            imagePicker.delegate = self
            imagePicker.sourceType = .camera
            present(imagePicker, animated: true)
        }
    }

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingImage image: UIImage!, editingInfo: [AnyHashable: Any]!) {
        dismiss(animated: true, completion: nil)
        imageView.image = image
    }

}

extension Data {
    var image: UIImage? { return UIImage(data: self) }
}

extension UIImage {
    var data: Data? { return UIImagePNGRepresentation(self) }
    func applying(contrast value: NSNumber) -> UIImage? {
        guard let ciImage = CIImage(image: self)?.applyingFilter("CIColorControls", withInputParameters: [kCIInputContrastKey: value]) else { return nil }
        UIGraphicsBeginImageContextWithOptions(size, false, scale)
        defer { UIGraphicsEndImageContext() }
        UIImage(ciImage: ciImage).draw(in: CGRect(origin: .zero, size: size))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}

样本项目

Xcode 9.0•Swift 4.0

    func activityIndicator(_ title: String) {

        strLabel.removeFromSuperview()
        activityIndicator.removeFromSuperview()
        effectView.removeFromSuperview()

        strLabel = UILabel(frame: CGRect(x: 50, y: 0, width: 160, height: 46))
        strLabel.text = title
        strLabel.font = .systemFont(ofSize: 14, weight: .medium)
        strLabel.textColor = UIColor(white: 0.9, alpha: 0.7)

        effectView.frame = CGRect(x: view.frame.midX - strLabel.frame.width/2, y: view.frame.midY - strLabel.frame.height/2 , width: 160, height: 46)
        effectView.layer.cornerRadius = 15
        effectView.layer.masksToBounds = true

        activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .white)
        activityIndicator.frame = CGRect(x: 0, y: 0, width: 46, height: 46)
        activityIndicator.startAnimating()

        effectView.contentView.addSubview(activityIndicator)
        effectView.contentView.addSubview(strLabel)
        view.addSubview(effectView)
    }


 类似资料:
  • 问题内容: 我目前正在屏幕上显示。警报的视图应仅在警报中心显示2个元素,一个标题和一个。下面是显示警报及其元素的功能。 但是,活动指示器不会显示在视图中心,实际上它显示在屏幕的右下角,离视图很远。这是什么原因呢? 编辑:我知道我可以为指标的位置硬编码数字,但是我希望警报在具有多种屏幕尺寸和方向的多种设备上运行。 问题答案: 创建视图时,请务必设置frame属性。 到@ 62Shark:

  • 当我运行以下代码时,下面的错误显示为:org。openqa。硒。遥远的UnreachableBrowserException:无法启动新会话。可能的原因是远程服务器地址无效或浏览器启动失败。 chrome浏览器尚未启动。 //基类。爪哇: 公共类基类{ }

  • 这个问题很明显,但仍然没有人帮我解决。我正在使用一个需要通过数组适配器填充字符串的旋转器。但是在运行应用程序时,发生了< code >空指针异常。我还声明了spinner和< code>ArrayAdapter 这是我的代码: 在onCreate中:

  • 我看过一些样品,但没有一个适合我的需要。 我已经为动画创建了两个xml文件,但我不知道在更改的可见性时如何启动它们。

  • 我想突出显示JavaFX中显示的部分文本。到目前为止,我正在使用对象中的对象。为了突出显示文本中的特定部分,我使用标记将文本切割成部分(objects),以突出显示或不突出显示以下代码。 不幸的是,背景高亮显示不起作用,我有奇怪的换行符,如图所示。文本不包含任何换行符。 (对图片质量表示抱歉,这是一个真实的截图:)) 感谢任何帮助。 解决方案正如@eckig所建议的,在HBox中使用多个标签是一个

  • 我的问题是:我在JPanel中显示了一个JLabel的数组列表和一个JPanel的按钮,当我按下按钮时,我想在JLabel的上方显示我的JPanel。但是当我按下按钮时,我的JPanel在标签下面。 请不要告诉我使用JLayerPane,因为如果我可以不用它,那将是最好的。感谢您的解决方案。 这是我的代码的一个例子:要运行这个,请在这里找到图像100x100: http://www.html5ga