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")
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
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)
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.
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.
label.bottomAnchor.constraint(...)
und begann sich alles auf Magische Weise wieder zu arbeiten.In meinem Fall war es die
aligment
Eigenschaft des StackView das war das problem verursacht.Wenn ich einstelle, das Eigentum zu
Fill
stattCenter
das problem verschwand.folgenden theGuy ist Antwort, habe ich die sherlock-app und ich fand sofort das problem:
In meinem Fall hatte ich eine benutzerdefinierte Ansicht Unterklasse in
loadView
. Dass die Unterklasse hatteisUserInteractionEnabled = false
was übersetzt unten, um alle sub-Ansichten auch meine stackView und von von allen seinen Ansichten und Schaltflächen.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.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!