如何以编程方式绘制边框并在 UIImageview 周围的文字后将其删除?

Posted

技术标签:

【中文标题】如何以编程方式绘制边框并在 UIImageview 周围的文字后将其删除?【英文标题】:how to programmatically draw border and remove it after words around UIImageview? 【发布时间】:2012-04-10 11:44:50 【问题描述】:

请先阅读我的问题,然后再将其标记为重复或重复问题...

    我有一个 scoleView,我在其中以表格形式放置了一些图像。

    当用户单击其中一个时,将显示下一个视图控制器,并且 点击图片的uiview得到绿色边框。

    当用户导航回到这个视图时,点击的图像就会显示出来 带绿色边框。这一切都很好

但是当用户点击其他图片时问题就开始了:之前点击的图片没有恢复正常,即即使我将其宽度设置为 0.0 并将颜色设置为clearColor,它的边框仍然存在。

请指导我如何删除这些边框

我的代码如下:

for (int row = 0; row < r; ++row)
    
        for (int col = 0; col < 2; ++col)
        
            int index = (row * 2) + col;
            if(index < [tempArr count])
            
                CGRect frame = CGRectMake(10+col*(10+145),10+row*(5+100),145, 100);
                UIView *fr = [[UIView alloc] initWithFrame:frame];
                CGRect imgFrame = CGRectMake(0, 0, 145, 100);
                UIImageView *imgView = [[UIImageView alloc]initWithFrame:imgFrame];
                imgView.image = [UIImage imageNamed:[[tempArr objectAtIndex:index]valueForKey:@"add"]];
                UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];
                fr.layer.borderWidth = 0.0f;
                fr.layer.borderColor = [UIColor greenColor].CGColor;
                if(selctedFrame == index)//Here i put border
                
                    fr.layer.borderWidth = 2.0f;
                    fr.layer.borderColor = [UIColor greenColor].CGColor;
                
                else //here i remove them
                
                    fr.layer.borderWidth = 0.0f;
                    fr.layer.borderColor = [UIColor clearColor].CGColor;
                
                tapGesture.numberOfTapsRequired = 1;
                tapGesture.numberOfTouchesRequired = 1;
                [fr addGestureRecognizer:tapGesture]; 
                [fr addSubview:imgView];
                fr.tag = index;
                [self.scrollDisplay addSubview:fr];
                [self.scrollDisplay bringSubviewToFront:fr];
            
        
    
    [self.view addSubview:self.scrollDisplay];

这个方法在viewWillAppear:animated:方法中调用

编辑

经过一些来回导航

【问题讨论】:

【参考方案1】:

新答案- 我认为问题在于您一次又一次地添加新视图。不要执行UIView *fr = [[UIView alloc] initWithFrame:frame];,而是找到已经存在的视图:UIView *fr = [self.scrollDisplay viewWithTag:index]; 并对其进行更改。实际上,除了导致上述问题之外,新的图像视图正在添加到效率非常低的旧图像视图上。我假设您已经将视图添加到 scrollDisplay。您也不应该再次创建新的imgView 对象。为它们设置标签,使它们独一无二且易于获取。例如,为每个imgView 设置标签999 并将其检索为:UIImageView *imgView = [fr viewWithTag:999]; 此外,在最后去掉[fr addSubview:imgView];[self.scrollDisplay addSubview:fr];[self.view addSubview:self.scrollDisplay];。所以你的代码应该是这样的:

for (int row = 0; row < r; ++row)
    
        for (int col = 0; col < 2; ++col)
        
            int index = (row * 2) + col;
            if(index < [tempArr count])
            
                CGRect frame = CGRectMake(10+col*(10+145),10+row*(5+100),145, 100);
                UIView *fr = [self. scrollDisplay viewWithTag:index];
                CGRect imgFrame = CGRectMake(0, 0, 145, 100);
                UIImageView *imgView = [fr viewWithTag:999];
     //imgView.image = [UIImage imageNamed:[[tempArr objectAtIndex:index]valueForKey:@"add"]]; //<--You've already set the image before so you don't need this
                UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapAction:)];
                fr.layer.borderWidth = 0.0f;
                fr.layer.borderColor = [UIColor greenColor].CGColor;
                if(selctedFrame == index)//Here i put border
                
                    fr.layer.borderWidth = 2.0f;
                    fr.layer.borderColor = [UIColor greenColor].CGColor;
                
                else //here i remove them
                
                    fr.layer.borderWidth = 0.0f;
                    fr.layer.borderColor = [UIColor clearColor].CGColor;
                
                tapGesture.numberOfTapsRequired = 1;
                tapGesture.numberOfTouchesRequired = 1;
    //[fr addGestureRecognizer:tapGesture]; //<-- Not needed if you've already done this
    //[fr addSubview:imgView];//<-- Not needed
                fr.tag = index;
    //[self.scrollDisplay addSubview:fr];//<-- Not needed
                [self.scrollDisplay bringSubviewToFront:fr];//<-- probably not needed
            
        
    
    //[self.view addSubview:self.scrollDisplay];//<-- Not needed

【讨论】:

nop 没有任何变化,只是看看我刚刚添加的应用程序屏幕截图 实际上在 viewWillAppear 上:这个滚动视图是用图像创建的,当图像是全尺寸时,即左上角的边框将被重置,但较小尺寸的图像保留边框,所以我有每次都将图像视图添加到滚动视图中,否则滚动视图上不会显示任何内容 但是当我将边框颜色设置为视图的背景视图颜色并读取边框时,我得到了一些解决方法【参考方案2】:

我只需要将边框颜色设置为视图的背景颜色。任何其他选项都没有做任何其他事情都没有隐藏边框我得到的唯一解决方法是这个

【讨论】:

以上是关于如何以编程方式绘制边框并在 UIImageview 周围的文字后将其删除?的主要内容,如果未能解决你的问题,请参考以下文章

如何绘制UILabel边框[重复]

以编程方式向 UIImageView 添加约束

如何以编程方式将 UIImageView 添加到 UIStackView(故事板)

如何以编程方式更改 UIImageView 的高度?

如何以编程方式自动旋转UIScrollView和UIImageView?

如何以编程方式使用 UIImageView Overlap 修复 UICollectionViewCell