簡體   English   中英

UIView子類中的UIButton不起作用,Swift

[英]UIButton inside a UIView subclass is not working, Swift

我見過類似的SO問題,最有前途的問題建議設置.isUserInteractionEnabled = true.bringSubview(toFront: subView)但是這兩種方法在我看來都不起作用(不確定我是否使用正確)。 我既不能為視圖設置backgroundColor和border。

請告訴我我要去哪里錯了。

我想在子視圖中單擊editButton時調用一個函數。

這是我運行代碼時得到的:

在此處輸入圖片說明

這是代碼:

class ProfilePhotoView: UIView{

    var profileImage    =   UIImageView()
    var editButton      =   UIButton()
    var currentViewController   : UIViewController



    init(frame: CGRect, viewController : UIViewController){
        self.currentViewController = viewController

        super.init(frame: frame)
        self.isUserInteractionEnabled = true
        setup()
    }



    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


    func setup(){

        profileImage.image = #imageLiteral(resourceName: "profilePlaceHolder")
        editButton.setTitle("edit", for: .normal)
        editButton.setTitleColor(Colors.curieBlue, for: .normal)
        editButton.isUserInteractionEnabled = true
        editButton.addTarget(self, action: #selector(editPhoto), for: .touchUpInside)

        profileImage.translatesAutoresizingMaskIntoConstraints  =   false

        editButton.translatesAutoresizingMaskIntoConstraints     =   false

        self.addSubview(profileImage)
        self.addSubview(editButton)


        let viewsDict = [ "profileImage"    :   profileImage,
                          "editButton"       :   editButton
        ] as [String : Any]

        self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[profileImage]", options: [], metrics: nil, views: viewsDict))
        self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-10-[profileImage]", options: [], metrics: nil, views: viewsDict))



        self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[editButton]", options: [], metrics: nil, views: viewsDict))
        self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[profileImage]-10-[editButton]", options: [], metrics: nil, views: viewsDict))

    }

    func editPhoto(){
        Utils.showSimpleAlertOnVC(targetVC: currentViewController, title: "Edit Button Clicked", message: "")
    }


}

使用ProfilePhotoView的ViewController

class ProfilePhotoViewVC: UIViewController {

    var profilePhotoView    :   ProfilePhotoView!
    //let imagePickerController   =   UIImagePickerController() // Initializing imagePicker
    //var imagePickerDelegate     =   ProfilePhotoDelegate()



    override func viewDidLoad() {
        super.viewDidLoad()

        let profilePhotoFrame               = CGRect(x: 0, y: 0, width: 300, height: 800)
        profilePhotoView                    =   ProfilePhotoView(frame: profilePhotoFrame, viewController: self)
        profilePhotoView.isOpaque           = false
        profilePhotoView.backgroundColor    = Colors.lightGrey
        profilePhotoView.layer.borderWidth  = 1
        profilePhotoView.layer.borderColor  = Colors.iOSBlue.cgColor
        profilePhotoView.translatesAutoresizingMaskIntoConstraints   =   false

        view.addSubview(profilePhotoView)
        view.bringSubview(toFront: profilePhotoView)

        view.isUserInteractionEnabled = true

        let viewsDict = [ "profilePhotoView"    :   profilePhotoView] as [String : Any]

        view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[profilePhotoView]", options: [], metrics: nil, views: viewsDict))
        view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-10-[profilePhotoView]", options: [], metrics: nil, views: viewsDict))

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

設置此設置后:

profilePhotoView.translatesAutoresizingMaskIntoConstraints = false

您的profilePhotoViewwidthheight設置為0 ,並且需要使用約束條件對其進行指定。 在您的視覺格式中添加(==300)(==800)以進行設置:

view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-10-[profilePhotoView(==300)]", options: [], metrics: nil, views: viewsDict))
view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-10-[profilePhotoView(==800)]", options: [], metrics: nil, views: viewsDict))

另外,考慮使用NSLayoutConstraint.activate()激活約束,而不是將約束添加到視圖中。 iOS將為您添加約束到正確的視圖。 另外, options的默認值為[] ,因此可以將其保留為關閉狀態:

NSLayoutConstraint.activate(NSLayoutConstraint.constraints(
    withVisualFormat: "H:|-10-[profilePhotoView(==300)]",
    metrics: nil, views: viewsDict)
)
NSLayoutConstraint.activate(NSLayoutConstraint.constraints(
    withVisualFormat: "V:|-10-[profilePhotoView(==800)]",
    metrics: nil, views: viewsDict)
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM