Montag, Juni 1, 2020

Reagiert UIButton in Untersicht Hinzugefügt UIStackView

In der detailViewController einer UISplitView ich habe subviews Hinzugefügt UIStackView innerhalb einer UIScrollView.

Nur mit system-Tasten, ohne subviews oder images Ergebnisse in responsive Tasten, aber subviews scheinen zu stören.

Aktivieren der touch ist speziell codiert. Ich habe versucht zu halten jeder Blick in die mit anzeigen, so gibt es keine überschneidungen ungültig empfangen von touch-events, aber nicht sicher, ob dies ordnungsgemäß erfolgt ist.
Jeder subview enthält eine label und eine benutzerdefinierte Schaltfläche mit einem Bild. Die Untersicht wird dann Hinzugefügt, um die stackview, und die stackview zu den scrollview.

Vielen Dank für jede Hilfe.

override func viewDidLoad() {
    super.viewDidLoad()

    scrollView = UIScrollView()
    scrollView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(scrollView)

    //Constrain the scroll view within the detailView
    view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[scrollView]|", options: .AlignAllCenterX, metrics: nil, views: ["scrollView": scrollView]))
    view.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[scrollView]|", options: .AlignAllCenterX, metrics: nil, views: ["scrollView": scrollView]))


    stackView = UIStackView()

    stackView.frame = CGRectMake(0,0,view.frame.width, 1000)
    stackView.translatesAutoresizingMaskIntoConstraints = false
    stackView.axis = .Vertical
    scrollView.contentSize = CGSizeMake(400, 1000)
    scrollView.addSubview(stackView)

    //Constrain the stackView within the scrollView
scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[stackView]|", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView]))
scrollView.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[stackView]", options: NSLayoutFormatOptions.AlignAllCenterX, metrics: nil, views: ["stackView": stackView]))


    let selectedGroup: Group = GroupArray[5]

    let descriptorsArray = selectedGroup.descriptorsArray

    for descriptor in descriptorsArray {
        //Create a subview for each descriptor

        let subView = UIView()
        subView.frame = CGRectMake(0 , 0, self.stackView.frame.width-10, 54)
        subView.backgroundColor = UIColor.yellowColor()

        subView.heightAnchor.constraintEqualToConstant(54.0).active = true
        //Create a label for Descriptor subview

        let label = UILabel(frame: CGRectMake(20, 0, 200, 50))
        label.text = descriptor.name
        label.font = UIFont.boldSystemFontOfSize(22.0)
        label.textAlignment = .Left
        label.textColor = UIColor.brownColor()
        label.backgroundColor = UIColor.greenColor()
        label.heightAnchor.constraintEqualToConstant(50.0).active = true
        subView.addSubview(label)

        //Create a button for Checkbox
        let btn = UIButton()
        btn.frame = CGRectMake(220, 0, 50, 50)
        btn.backgroundColor = UIColor.blueColor()
        btn.setImage(UIImage(named:"checked.png"), forState: UIControlState.Normal)

        btn.heightAnchor.constraintLessThanOrEqualToConstant(50.0)
        btn.widthAnchor.constraintLessThanOrEqualToConstant(50.0)

        btn.addTarget(self, action: "btnPressed:", forControlEvents: UIControlEvents.TouchUpInside)

        subView.addSubview(btn)
        btn.userInteractionEnabled = true
        subView.userInteractionEnabled = true
        stackView.userInteractionEnabled = true
        scrollView.userInteractionEnabled = true
        stackView.addArrangedSubview(subView)


    }
}

func btnPressed(sender: UIButton!) {

    print("btn Pressed")

}
InformationsquelleAutor Jolly | 2016-08-26

7 Kommentare

  1. 6

    Scheint es zu sein, dass etwas ist, liegen über Ihre Schaltfläche und fangen alle touch-events.

    1. Schalten Sie niemals auf userInterectionEnabled wenn Sie es nicht brauchen,

    Gibt keinen Grund, warum eine normale Ansicht wie Untersicht festgelegt haben, sollten userInteractionEnabled auf true gesetzt, so setzen Sie es auf false.

    2. Finden Sie den Fehler:

    Herauszufinden, Hexe Ansicht fängt das event starten Ihre app auf einem Gerät, und navigieren Sie zu der stackView. Jetzt in Xcode, drücken Sie die Schaltfläche „Debug View-Hierarchie“ (die direkt über die console-Ausgabe)

    Reagiert UIButton in Untersicht Hinzugefügt UIStackView

    Danach sehen Sie alle anzeigen, die derzeit auf Ihrem Gerät angezeigt.
    Was Sie jetzt tun, ist, herauszufinden, welche Ansichten über die Schaltfläche, und klicken Sie dann im code drehen Ihre userInteractionEnabled Wert auf false.

    • M Kremer danke dir so sehr für diese debugging-Vorschlag. Es ist das richtige lehrbuch und funktionalen Ansatz, so ich markiert es als richtig, aber ich konnte nicht finden die überlappung mit diesem Ansatz. Da ich wusste, dass gestapelte Schaltflächen gearbeitet, während gestapelt Untersichten nicht (für mich), meine Lösung war die stack-Tasten anstelle von Untersichten mit Tasten in Ihnen. Ich änderte den hintergrund der einzelnen Tasten je nach Zustand. Statt einem label, habe ich den Titel. Keine Aussicht, sich zu überschneiden, da sollte alles enthalten sein, in der Sie die-Taste.
    • Der Standardwert für alle Ansichten, JA.
  2. 19

    Ich hatte das exakt gleiche Problem: eine StackView enthält Ansichten. Jede Ansicht enthält eine Schaltfläche und ein label. Die Ansichten sind nur Container für layout-Gründen.

    In meinem Fall: ich habe nicht die Ansicht einer Höhe von constraint-und es scheint, dass es eine null-Höhe (nach dem ändern der Hintergrundfarbe für das debugging habe ich nicht sehen, der Blick), aber der button und label zu sehen war (aber nicht reagiert).

    Nachdem ich Sie Hinzugefügt haben eine Höhe Einschränkung der layout-Sicht die (debug -) Hintergrundfarbe war sichtbar und die Tasten reagierten wie erwartet.

    • Dies hat mich gerettet, danke. Ich Hinzugefügt eine fehlende label.bottomAnchor.constraint(...) und begann sich alles auf Magische Weise wieder zu arbeiten.
    • Ich hatte das ähnliche Problem. Ich habe nicht Breite Einschränkung für die wrapper-Ansicht, so dass es keine Breite in der runtime.
  3. 9

    In meinem Fall war es die aligment Eigenschaft des StackView das war das problem verursacht.

    Wenn ich einstelle, das Eigentum zu Fill statt Center das problem verschwand.

    • Danke dafür!!!! Ich hatte alles versucht, was ich denken konnte, und ich hätte nie gedacht, zu versuchen, die!
    • Danke Mann. Sie meinen Tag gerettet
    • Danke, Ihr helft mir.
    • Danke, Mann. Sie meinen Tag gerettet.
    • Es ist diese Art von Zeug, das UIKit nicht, dass macht mich wollen, um durch meinem Mac durch ein Fenster. Vielen Dank für diese Antwort!
  4. 1

    In meinem Fall hatte ich eine benutzerdefinierte Ansicht Unterklasse in loadView. Dass die Unterklasse hatte isUserInteractionEnabled = false was übersetzt unten, um alle sub-Ansichten auch meine stackView und von von allen seinen Ansichten und Schaltflächen.

  5. 1

    Ich lief in dieses Problem mich. In meinem Fall hatte ich eine UIStackView als Untersicht meiner UIButton. Ich brauchte, um isUserInteractionEnabled = false auf die stack-Ansicht, um die zu bekommen, meine Taste, um zu arbeiten. Dies ist wahrscheinlich eine kluge Sache auf jeden UIButton Untersicht.

  6. 0

    Habe ich kommen, überqueren das gleiche Problem. Der Grund ist, dass ich die set-Taste.alpha = 0, während der Einstellung die-Taste.Schicht.opacity = 1.0. In diesem Fall, dann enthält die Schaltfläche keine Reaktion auf die Handlungen obwohl es sichtbar. Also setting-Taste.alpha = 1.0 ist die Antwort. Kann das helfen!

Kostenlose Online-Tests