2016-08-07 66 views
1

Meistens habe ich Elemente auf AutoLayout erstellt, aber es gibt einige uiviews, die programmgesteuert erstellt werden. Es gibt ein Ereignis, das einige Logik und UI ändern muss. Alles funktioniert gut, außer programmatisch erstellten uiviews. Sie ändern ihren Zustand erst nach einem zweiten Klick. Wenn ich außerdem auf eine andere programmgesteuerte uiview klicke, verlieren die vorherigen uiviews ihren aktuellen Status und kehren auf den Standardwert zurück. Wahrscheinlich könnte es ein Problem mit Threads geben, ich habe einige Kombinationen von dispatch_async versucht, aber es hat nicht geholfen. HierProgrammatisch erstellt uiview reagiert nicht auf den ersten Klick

ist das Ereignis:

func actFilterComfort(sender: UIButton) { 
    let subview = self.labelSettingViewComfort.subviews[0] as UIView 
    let imageView = sender.superview?.viewWithTag(120) as! UIImageView 

    if(!filters.comfort) { 
     filters.comfort = true 
     filters.comfortImage.frame = CGRectMake(self.comfortDisplay.frame.origin.x + (CGFloat(filters.counter) * 10.0), 0.0, 20.0, 20.0) 
     self.comfortDisplay.hidden = true 
     subview.addSubview(filters.comfortImage) 
     subview.sendSubviewToBack(filters.comfortImage) 

     imageView.alpha = 1 

     filters.counter += 1 
    } 
    else { 
     filters.comfort = false 

     imageView.alpha = 0 

     filters.comfortImage.removeFromSuperview() 
     if(filters.counter == 1) { 
      self.comfortDisplay.hidden = false 
     } 
     else { 
      self.alignFiltersImages(subview, counter: filters.counter) 
     } 
     filters.counter -= 1 
    } 
} 

imageView ist ein programmatisch erstellt uiview. Es sollte sein Alpha ändern, aber es tut es nicht. Andere Dinge funktionieren gut.

Antwort

1

Sie müssen auch Image Alpha ändern. Eine Erweiterung für UIImage:

extension UIImage { 
    func setImageAlpha(alpha:CGFloat) -> UIImage { 
     UIGraphicsBeginImageContextWithOptions(self.size, false, 0.0) 

     let ctx = UIGraphicsGetCurrentContext(); 
     let area = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height); 

     CGContextScaleCTM(ctx, 1, -1); 
     CGContextTranslateCTM(ctx, 0, -area.size.height); 
     CGContextSetBlendMode(ctx, .Multiply); 
     CGContextSetAlpha(ctx, alpha); 
     CGContextDrawImage(ctx, area, self.CGImage); 

     let newImage = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 

     return newImage; 
    } 
} 

Verwenden Sie den folgenden Code zum Ändern Bild alpha in Imageview nach der Einstellung Imageview alpha:

imageView.image = imageView.image?.setImageAlpha(1.0) 

Sie auch verborgene Eigenschaft für Imageview zeigen und verstecken, anstatt Einstellung alpha einstellen . Wenn alpha zu diesem Zeitpunkt 0 ist, setze imageView.hidden = true und wenn Alpha zu diesem Zeitpunkt 1 ist, setze imageView.hidden = false

+0

Nein, es funktioniert nicht beim ersten Mal. Ich denke, das Problem hängt mit der Definition dieser uiview zusammen. Weil es nicht nur beim ersten Klick funktioniert. Dann fängt es an gut zu funktionieren. Es scheint so, als ob uiview beim ersten Klick definiert wird und irgendwo im Thread gespeichert wird und erst danach seine Eigenschaften ändert. – Slava

+0

Ändern Sie den Anfangswert von filters.comfort, wenn es wahr ist, ändern Sie es mit false und wenn es falsch ist, ändern Sie es mit true –