以编程方式创建的 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

以编程方式清空 UIStackView

以编程方式创建UIView,在旋转设备时保留其大小

无法在以编程方式创建的窗口中单击 iAd - 未调用bannerViewActionShouldBegin?

对于以编程方式创建的 UIButton,有时不会触发按钮单击事件

Objective C-以编程方式插入UIButton的标题,在选中时更改背景和标题颜色