代码之家  ›  专栏  ›  技术社区  ›  Dan Ray

uibutton不收听内容模式设置?

  •  85
  • Dan Ray  · 技术社区  · 14 年前

    FirstButton是自定义类型的uiButton。我用程序将其中三个放在一张桌子的每一个单元格中,thusly:

    [firstButton setImage:markImage forState:UIControlStateNormal];
    [firstButton setContentMode:UIViewContentModeScaleAspectFit];
    [cell.contentView addSubview:firstButton];
    

    在其他地方,我要告诉剪报记者。我得到的是图像中心正方形的裁剪,而不是它的纵横比例渲染。我已经尝试了很多方法,包括在firstbutton.imageview上设置模式属性,这似乎也不起作用。

    15 回复  |  直到 5 年前
        1
  •  177
  •   Aaron Brager    10 年前

    我也有同样的问题。我看到这个问题有点老了,但我想提供一个清晰和正确的答案,以节省其他人(像我)在搜索结果中弹出时的一些时间。

    我花了一点时间进行搜索和试验,但我找到了解决方案。只需设置ui按钮内的“隐藏”ImageView的ContentMode。

    [[firstButton imageView] setContentMode: UIViewContentModeScaleAspectFit];
    [firstButton setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
    

    也许这就是丹·雷在他公认的回答中所暗示的,但我怀疑不是。

        2
  •  63
  •   arlomedia    5 年前

    如果要处理uibutton的图像(而不是背景图像),则在uibutton本身或其ImageView上设置ContentMode没有任何效果(尽管其他答案都是如此)。

    也可以这样做:

    self.button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
    self.button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
    

    或者相应地调整图像大小。

    或者只使用一个UIImageView(它正确地尊重ContentMode)和一个附加的UITapGestureRecognizer,或者在它上面使用一个透明的UIButton。

        3
  •  41
  •   Chris Nolet Chen_Wayne    6 年前

    而不是设置 contentMode 在按钮本身上,您需要设置 contentHorizontalAlignment contentVerticalAlignment 特性和 内容模式 按钮的 imageView 用于任何方面的填充或配合。下面是一个例子:

    button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
    button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
    button.imageView.contentMode = UIViewContentModeScaleAspectFit;
    

    当然,您还可以执行其他操作,如将按钮的图像与按钮顶部对齐。如果不需要方面填充或调整,只需自行设置对齐:

    button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop;
    

    在Swift中,您需要使用:

    button.contentHorizontalAlignment = .fill
    button.contentVerticalAlignment = .fill
    button.imageView?.contentMode = .scaleAspectFit
    

    这适用于所有版本的iOS,包括最新版本的自动布局(即iOS 4至iOS 11+)。

        4
  •  7
  •   Pierre    14 年前

    在经历了几个小时的混乱之后,下面是我如何让它在iOS 3.2下工作的。正如杜斯克所提到的,使用挫折基础图像而不是setimage为我做了这项工作。

    CGRect myButtonFrame = CGRectMake(0, 0, 250, 250);
    UIImage *myButtonImage = [UIImage imageNamed:@"buttonImage"];
    
    UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
    
    [myButton setBackgroundImage:myButtonImage forState:UIControlStateNormal];
    [myButton setFrame: myButtonFrame];
    [myButton setContentMode: UIViewContentModeScaleAspectFit];
    
        5
  •  6
  •   Dan Ray    14 年前

    答案是将uiImageView与您想要的所有可爱的内容模式设置一起使用,然后在其上放置一个自定义按钮。你不能一次就做到这一点,这太蠢了,但看起来你不能。

        6
  •  4
  •   iOSDevSF    12 年前

    找到了一个修复方法。设置 adjustsImageWhenHighlighted 性质 UIButton NO .

      UIButton *b = [[UIButton alloc] initWithFrame:rect];
            [b setImage:image forState:UIControlStateNormal];
            [b.imageView setContentMode:UIViewContentModeScaleAspectFill];
            [b setAdjustsImageWhenHighlighted:NO];
    

    希望这有帮助。请在下面发表评论,我将跟进您的任何问题。

        7
  •  3
  •   Tariq    9 年前

    唯一适合我的解决方案:

    [button setImage:image forState:UIControlStateNormal];
    button.imageView.contentMode = UIViewContentModeScaleAspectFill;
    button.contentHorizontalAlignment = UIControlContentHorizontalAlignmentFill;
    button.contentVerticalAlignment = UIControlContentVerticalAlignmentFill;
    
        8
  •  2
  •   ninjaneer    10 年前

    我的答案和库巴的很相似,我需要我的图像被编程设定。

    UIImage *image = [[UIImage alloc] initWithContentsOfFile:...];
    [button setBackgroundImage:image forState:UIControlStateNormal];
    button.imageView.contentMode = UIViewContentModeScaleAspectFill; //this is needed for some reason, won't work without it.
    for(UIView *view in button.subviews) {
        view.contentMode = UIViewContentModeScaleAspectFill;
    }
    
        9
  •  2
  •   Vaibhav Saran    7 年前

    斯威夫特3

    self.firstButton.imageView?.contentMode = .scaleAspectFill
    
        10
  •  1
  •   dusker    14 年前

    不要使用setimage,而是使用backundgroundimage

        11
  •  1
  •   JohnPayne    11 年前

    我相信我们这里有一个简单的接口生成器问题——显然,在设置了image属性之后,ib忽略了任何内容模式更改。

    解决方案很简单:设置内容模式,删除以前设置的图像名称(确保在所有状态下删除,默认,突出显示等),然后在所有所需状态下重新输入所需的图像名称-et voil_。

        12
  •  0
  •   MonsieurDart    14 年前

    我也建议你看看 adjustsImageWhenHighlighted UIButton 属性以避免在按下按钮时图像发生奇怪的变形。

        13
  •  0
  •   jankins    12 年前

    为了解决这个问题,随着时间的推移,我的方法变得更加简单,最后我将uibutton子类化并覆盖sethighlighted:

    对我来说,只需把图像alpha降到0.5,因为它们的背景是黑色的。

    但是,只有当我注释掉[super sethighlighted:](图像拉伸代码出现的地方),它才起作用,这感觉根本不是解决这个问题的正确方法……不过,一切似乎都正常工作。当我继续努力的时候,我们会看到它是如何支撑的。

    - (void)setHighlighted:(BOOL)highlight {
        if (highlight) {
            [self.imageView setAlpha:.5];
        }  else {
            [self.imageView setAlpha:1];        
        }
    
    //    [super setHighlighted:highlight];
    }
    
        14
  •  0
  •   Jakub Streetboy    11 年前

    如果有人在iOS 6、iOS 7和故事板中寻找答案:

    您可以在故事板中设置图像:

    然后:

    for(uiview*testid in self.subview){
    if([testid iskindofclass:[uiImageView类]])
    [测试设置内容模式:uiviewcontentmodescaleaspectfill];
    }
    < /代码> 
    
    
    

    您可以在故事板中设置图像:

    enter image description here

    然后:

    for(UIView* testId in self.subviews) {
        if([testId isKindOfClass:[UIImageView class]])
            [testId setContentMode:UIViewContentModeScaleAspectFill];
    }
    
        15
  •  0
  •   Totoro    8 年前

    如果ui按钮似乎不听取布局约束设置,请检查图像是否大于按钮大小。视网膜分辨率始终使用@2X和@3X图像。