以编程方式创建 UIButton 比使用情节提要模糊
Posted
技术标签:
【中文标题】以编程方式创建 UIButton 比使用情节提要模糊【英文标题】:creating UIButton programmatically is blurry than using storyboard 【发布时间】:2014-02-27 03:56:26 【问题描述】:我有两个具有相同图像的自定义 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];
这里是项目下载link(因为GFW,只能上传到中文网站)。这是 Xcode 的错误吗?
【问题讨论】:
【参考方案1】: purchaseButton.frame=CGRectMake(0, 35.5+30, 177, 55);
你的问题。永远不要给接口对象非整数坐标。会很模糊! - 你会注意到在 Interface Builder(故事板)中你不能这样做。
原因是屏幕上有物理像素,没有半个像素这样的东西:每个像素都不是开就是关。所以如果你使用半点坐标,它们就不能完全匹配像素,系统会模糊匹配的东西(抗锯齿等)。
所以,去掉.5
,事情会好很多。
【讨论】:
谢谢。但是在视网膜显示中,1 点=2 像素,那么 0.5 点=1 像素。如何在没有非整数坐标的情况下定位 1 像素? 不要考虑像素。考虑点。您在frame
中的值是积分。仅使用整数值。【参考方案2】:
与@matt 所说的相反,您现在可以执行 0.5,只要它是视网膜设备。你甚至可以有 0.5 的宽度和高度,这就是 ios 7 在某些地方获得非常细的线条的原因。
当我运行您的示例应用程序时,在 Retina iPad 模拟器中它并不模糊(也不会比源图像更模糊)。但在非 Retina iPad 模拟器中它是模糊的,这是因为框架中的 .5。
您需要测试屏幕的比例[UIScreen mainScreen].scale
,只有在比例大于 1 时才添加 .5。
另外请注意,您正在使用该代码创建两个按钮。您可以删除重复的行purchaseButton=[UIButton buttonWithType:UIButtonTypeCustom];
【讨论】:
非常感谢。我明白了。【参考方案3】:purchaseButton.frame=CGRectMake(0, 35.5+30, 177, 55);
其实
屏幕会有像素,不会有半个像素 我们为 UI 元素指定的坐标将是点。 点像素比取决于 dpi 和 ppi。IOS 主要基于点和 dpi 渲染所有事物,因此尝试使用半点会导致模糊。 (这就是为什么我们不能在界面生成器中将坐标设置为点)
所以不允许浮动强制它们会导致模糊。请使用最接近的整数值。
另一方面,由于将偶数除以奇数将主要给出浮点系数。动态计算时必须使用 ceil 和 floor 方法。
purchaseButton.frame=CGRectMake(0, ceil(self.view.fram.size.width/3), 177, 55);
【讨论】:
以上是关于以编程方式创建 UIButton 比使用情节提要模糊的主要内容,如果未能解决你的问题,请参考以下文章
UIButton 标题标签文本未使用情节提要或以编程方式更改
以编程方式创建视图和添加子视图比使用情节提要更好/更快[重复]
以编程方式将 UIButton 添加到带有情节提要的自定义 ViewController