大多数情况下,我在AutoLayout上创建了元素,但是有些uiviews是以编程方式创建的。有一个事件必须改变一些逻辑和UI。除了以编程方式创建的uiviews之外,一切正常。他们只有在第二次点击后才会改变状态。此外,如果我点击另一个以编程方式创建的uiview,之前的uiviews会丢失其当前状态并返回默认状态。可能是线程可能存在问题,我尝试了dispatch_async
的一些组合,但它没有帮助。
以下是活动:
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
是以编程方式创建的uiview。它应该改变它的alpha,但它不会。其他的事情很有效。
答案 0 :(得分:1)
您还需要更改图像alpha。 为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;
}
}
在设置imageView alpha后,使用以下代码更改imageView中的图像alpha:
imageView.image = imageView.image?.setImageAlpha(1.0)
您还可以为imageview显示和隐藏设置隐藏属性,而不是设置alpha。当alpha为0时,设置imageView.hidden = true,当alpha为1时设置imageView.hidden = false