以编程方式创建的 uiview 在第一次单击时没有响应
Posted
技术标签:
【中文标题】以编程方式创建的 uiview 在第一次单击时没有响应【英文标题】:Programmatically created uiview doesn't response at first click 【发布时间】:2016-08-07 09:35:15 【问题描述】:大多数情况下,我在 AutoLayout 上创建了元素,但也有一些以编程方式创建的 uiview。有一个事件必须更改一些逻辑和 UI。一切工作正常,除了以编程方式创建的 uiviews。他们只有在第二次点击后才会改变他们的状态。此外,如果我单击另一个以编程方式创建的 uiview,之前的 uiview 会丢失其当前状态并恢复为默认值。可能是线程有问题,我尝试了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,但它没有。其他的都很好。
【问题讨论】:
【参考方案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 显示和隐藏设置 hidden 属性,而不是设置 alpha。当 alpha 为 0 时设置 imageView.hidden = true,当 alpha 为 1 时设置 imageView.hidden = false
【讨论】:
不行,第一次不行。我认为,问题与这个uiview的定义有关。因为它不仅仅在第一次点击时起作用。然后它开始运作良好。似乎 uiview 是在第一次单击时定义的,它存储在线程中的某个位置,然后才开始更改其属性。 更改 filters.comfort 的初始值,如果为真,则改为 false,如果为假,则改为 true以上是关于以编程方式创建的 uiview 在第一次单击时没有响应的主要内容,如果未能解决你的问题,请参考以下文章
以编程方式在 xib 上使用自动布局创建的两个文本字段之间添加 uiview
无法在以编程方式创建的窗口中单击 iAd - 未调用bannerViewActionShouldBegin?