Ios 以编程方式创建UIButton比使用故事板更模糊

Ios 以编程方式创建UIButton比使用故事板更模糊,ios,objective-c,ios7,uibutton,Ios,Objective C,Ios7,Uibutton,我有两个自定义UIButton具有相同的图像。一个是以编程方式创建的,很模糊,另一个是使用情节提要,效果很好。下面是我的代码 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIButton *purchaseButton=[UIButton buttonWithType:UIBu

我有两个自定义UIButton具有相同的图像。一个是以编程方式创建的,很模糊,另一个是使用情节提要,效果很好。下面是我的代码

    - (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];
}
这里是项目下载(因为GFW,我只能上传到一个中文网站)。这是一个Xcode错误吗

    purchaseButton.frame=CGRectMake(0, 35.5+30, 177, 55);
这是你的问题。永远不要给接口对象非整数坐标。它会变得模糊您会注意到,在Interface Builder(故事板)中,您不能这样做

原因是屏幕上有物理像素,而没有半个像素这样的东西:每个像素都是开或关的。因此,如果使用半点坐标,它们无法精确匹配像素,系统将模糊要匹配的内容(抗锯齿等)


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

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

当我运行你的示例应用程序时,在视网膜iPad模拟器中,它并不模糊(也不比源图像更模糊)。但在非视网膜iPad模拟器中,它是模糊的,这是因为帧中的.5

您需要测试屏幕的比例
[UIScreen Main screen]。只有当比例大于1时,才需要缩放
并添加.5

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

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

  • 屏幕将有像素,不会有半像素
  • 我们为UI元素指定的坐标将是点
  • 点像素比取决于dpi和ppi
IOS主要基于点和dpi渲染所有内容,因此尝试使用半点会导致模糊。(这就是为什么我们不能在interface builder中设置点的坐标)

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

另一方面,由于奇数除以偶数将得到浮点系数。在动态执行计算时,我们必须使用ceil和floor方法


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

谢谢。但在视网膜显示中,1点=2像素,然后0.5点=1像素。如果没有非整数坐标,我如何定位1像素?不要考虑像素。想想要点。
帧中的值是点。只使用整数值。非常感谢。我理解。