以编程方式创建UIButton比使用storyboard模糊

时间:2014-02-27 03:56:27

标签: ios objective-c ios7 uibutton

我有两个自定义UIButton具有相同的image.One是以编程方式创建的,模糊,另一个是使用故事板,工作正常。这是我的代码

    - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    UIButton *purchaseButton=[UIButton buttonWithType:UIButtonTypeCustom];
    purchaseButton=[UIButton buttonWithType:UIButtonTypeCustom];
    purchaseButton.frame=CGRectMake(0, 35.5+30, 177, 55);
    [purchaseButton setImage:[UIImage imageNamed:@"GouMai1.png"] forState:UIControlStateNormal];

    [self.view addSubview:purchaseButton];
}

这是项目下载link(由于GFW,我只能将其上传到中文网站)。这是一个Xcode错误吗?

3 个答案:

答案 0 :(得分:2)

    purchaseButton.frame=CGRectMake(0, 35.5+30, 177, 55);

有你的问题。永远不要给界面对象非整数坐标。它会很模糊! - 您会注意到在中,无法执行此操作。

原因是在屏幕上有物理像素,并且没有半像素这样的东西:每个像素都是打开或关闭的,就像它一样。因此,如果你使用半点坐标,它们就不能完全匹配像素,系统会模糊匹配的东西(抗锯齿等)。

所以,摆脱.5,事情会好得多。

答案 1 :(得分:1)

与@matt所说的相反,只要它是视网膜设备,你现在可以做.5。你甚至可以拥有.5的宽度和高度,这就是iOS 7在某些地方获得非常细线的方式。

当我运行您的示例应用程序时,在Retina iPad模拟器中它并不模糊(不会比源图像模糊)。但在非Retina iPad模拟器中它很模糊,这是因为帧中的.5。

您需要测试屏幕的比例[UIScreen mainScreen].scale并仅在比例为>时添加.5。 1。

另请注意,您正在使用该代码创建两个按钮。您可以删除重复的行purchaseButton=[UIButton buttonWithType:UIButtonTypeCustom];

答案 2 :(得分:0)

purchaseButton.frame=CGRectMake(0, 35.5+30, 177, 55);

实际上

  • 屏幕将有像素,并且不会有半像素
  • 我们为UI Elements指定的坐标为点。
  • 点到像素比率将取决于dpi和ppi。

IOS主要基于点和dpi渲染所有内容,因此尝试使用半点会导致模糊。 (这就是为什么我们不能将坐标设置为界面构建器中的点)

因此不允许浮动强制它们导致模糊。请使用最接近的整数值。

另一方面,因为将偶数除以奇数将主要给出浮点系数。在动态执行计算时,我们必须使用ceil和floor方法。

purchaseButton.frame=CGRectMake(0, ceil(self.view.fram.size.width/3), 177, 55);