了解纵横比约束和乘数

Posted

技术标签:

【中文标题】了解纵横比约束和乘数【英文标题】:Understanding the Aspect ratio constraint and multiplier 【发布时间】:2016-01-06 11:08:58 【问题描述】:

我以编程方式创建了一个UIScrollview。我在这个滚动视图上添加了一些以编程方式创建的按钮。按钮高度为30。但按钮宽度根据屏幕大小而变化。

float scrollYearX=btnLeftArrow.frame.origin.x+btnLeftArrow.frame.size.width+15;
float scrollYearY=40.0;
float scrollYearWidth=btnRightArrow.frame.origin.x-15-scrollYearX;
float scrollYearHeight=50.0;
scrollYear=[[UIScrollView alloc] initWithFrame:CGRectMake(scrollYearX, scrollYearY, scrollYearWidth, scrollYearHeight)];

[scrollYear setShowsHorizontalScrollIndicator:NO];
[scrollYear setShowsVerticalScrollIndicator:NO];

[vwParent addSubview:scrollYear];
int buttonX=0;

for (int i=0; i<100; i++) 
    UIButton *btn=[[UIButton alloc] initWithFrame:CGRectMake(buttonX, 0, scrollYearWidth/5, 30)];
    [btn.titleLabel setFont:[UIFont fontWithName:@"HelveticaNeue" size:14.0]];

    int mod=i%2;
    if (mod==1) 
        [btn setTitle:@"-" forState:UIControlStateNormal];
        [btn.titleLabel setTextColor:[UIColor whiteColor]];

    
    else
    
        [btn addTarget:self action:@selector(yearClick :) forControlEvents:UIControlEventTouchUpInside];
        [btn setTitle:[NSString stringWithFormat:@"%li",(long)backYear] forState:UIControlStateNormal];
        if (backYear==year) 
            btnCurrentYear=btn;
            [btn setBackgroundImage:[UIImage imageNamed:@"yearSelect"] forState:UIControlStateNormal];
        
        backYear++;
    
    [scrollYear addSubview:btn];
    btnLast=btn;
    buttonX=buttonX+btn.frame.size.width;

[scrollYear setContentSize:CGSizeMake(btnLast.frame.origin.x+btnLast.frame.size.width, scrollYearHeight)];
[scrollYear setContentOffset:CGPointMake(btnCurrentYear.frame.origin.x-(btnLast.frame.size.width*2),0)];

我的问题是我应该使用哪个约束才能在每个设备中正确显示它。在这里,我附上了它在 6s 和 ipad pro 上的显示方式。如何让 ipad pro 的视觉效果和 6s 一样。

按钮锁定 6 秒

按钮在 ipad pro 中的外观

请帮助我。 谢谢

【问题讨论】:

【参考方案1】:

这是因为您的按钮背景宽度已缩放。您需要使用可调整大小的图像来保持圆形边缘。更改您的背景图片如下:

UIImage* backgroundImage = [UIImage imageNamed:@"yearSelect"];
backgroundImage = [backgroundImage resizableImageWithCapInsets:UIEdgeInsetsMake(0, backgroundImage.size.width/2-1, 0, backgroundImage.size.width/2)];
[btn setBackgroundImage:backgroundImage forState:UIControlStateNormal];

【讨论】:

可调整大小的图像是什么意思?以及如何使用它们? @user1960169 见 UIImage API,应该有类似 resizableImage 的方法。现在我使用 iPhone 客户端,无法查看文档。

以上是关于了解纵横比约束和乘数的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式快速更改纵横比约束

UIImageView 约束为 1:1 纵横比和 1:1 缩放到原始?

以编程方式更改纵横比约束值

带有约束的标签添加到具有纵横比的 ImageView

如何使用 SnapKit 在 iOS 中使用纵横比约束?

约束布局纵横比