将图像添加到ActionSheet并将其放在右边

时间:2019-06-12 08:13:53

标签: swift uialertcontroller uiactionsheet swift5

我想将图像放在ActionSheet的右侧,如AppStore所示。我知道如何添加图像并更改 date consumption 2019-06-01 3968 2019-06-02 9491 2019-06-03 20444 样式,但是我无法弄清楚如何更改这两个位置。

第三方库不受欢迎。

谢谢!

Screenshot - AppStore

3 个答案:

答案 0 :(得分:1)

已更新至Swift 4.2,并添加了图像。通过下面的链接获取更多信息。

How to customize UIAlertController with UITableView or is there any default control available like this UI in Pages app?

import Foundation
import UIKit

class CustomActionSheet: UIAlertController{

    private var controller : UITableViewController


    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {

        controller = UITableViewController(style: .plain)
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
        controller.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
        controller.tableView.dataSource = self
        controller.tableView.addObserver(self, forKeyPath: "contentSize", options: [.initial, .new], context: nil)
        self.setValue(controller, forKey: "contentViewController")
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    deinit {
        controller.tableView.removeObserver(self, forKeyPath: "contentSize")
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        guard keyPath == "contentSize" else {
            return
        }

        controller.preferredContentSize = controller.tableView.contentSize
    }

}

extension CustomActionSheet: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 4
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell")!

        switch(indexPath.row) {
        case 0:
            cell.textLabel?.text = "Share Link via iCloud"
            cell.accessoryView = UIImageView(image:UIImage(named:"image1.png")!)
            break
        case 1:
            cell.textLabel?.text = "Send a Copy"
           cell.accessoryView = UIImageView(image:UIImage(named:"image2.png")!)
            break
        case 2:
            cell.textLabel?.text = "Open in Another App"
            cell.accessoryView = UIImageView(image:UIImage(named:"image3.png")!)
            break
        case 3:
            cell.textLabel?.text = "Move to..."
            cell.accessoryView = UIImageView(image:UIImage(named:"image4.png")!)
            break
        default:
            fatalError()
        }

        return cell
    }
}

您可以从视图控制器中使用此自定义类

let controller = CustomActionSheet(title: nil, message: nil, preferredStyle: .actionSheet)
        controller.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
        self.present(controller, animated: true, completion: nil)

答案 1 :(得分:0)

无法使用标准的UIAlertController API。

滚动您自己的警报,或重新考虑您对第三方库的厌恶。

从文档中:

  

重要

     

UIAlertController类旨在按原样使用,并且不支持子类化。此类的视图层次结构是私有的,不能修改。

请注意,其他答案似乎有效,但违反了此限制。如果您确实遵循它们,请注意它们可能随时停止运行,甚至您的应用可能会被Apple拒绝。

答案 2 :(得分:0)

这有点棘手,但是可以实现; 首先不要使用UIActionSheet,因为iOS8已弃用 将UIAlertControllerpreferredStyle = .actionSheet

一起使用

然后手动放置图像:

let imageView = UIImageView(image: UIImage(named: "yourImage"))
imageView.frame = CGRect(x: alertController.view.frame.width-25-24, y: 18, width: 24, height: 24)
alertController.view.addSubview(imageView)

alertController.view.frame.width-25-24放置图片

注意:这会将图像放置在您的首要警报操作中。如果要对图像进行多种操作,则需要使用 y 坐标(例如)

let imageViewAction2 = UIImageView(image: UIImage(named: "yourSecondImage"))
alertController.view.addSubview(imageViewAction2)
imageViewAction2.frame = CGRect(x: alertController.view.frame.width-25-24, y: 75, width: 24, height: 24)