2014-06-08 27 views
2

我将一个UIButton(带有背景图像)添加到导航栏并设置带有边框的圆角。我得到在角落一个奇怪的黑色轮廓:为什么在UIButton的圆角处出现粗糙的黑色边缘?

enter image description here

这里是我用来创建viewDidLoad按钮的代码:

ProfileImageService *profileImageService = [ProfileImageService getService]; 

CGRect frame = CGRectMake(0, 0, 32, 32); 
UIButton *button = [[UIButton alloc] initWithFrame:frame]; 
[button setBackgroundImage:profileImageService.profileImage forState:UIControlStateNormal]; 
[button addTarget:self action:@selector(showMenu) forControlEvents:UIControlEventTouchUpInside]; 

button.layer.cornerRadius = button.frame.size.height/2.0; 
button.layer.masksToBounds = YES; 
button.clipsToBounds = YES; 
button.layer.borderWidth = 3; 
button.layer.borderColor = [UIColor colorWithRed:0 green:0.67 blue:0.97 alpha:1].CGColor; 

self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button]; 

我怎样才能使边界光滑,摆脱微妙的黑色轮廓?

+2

化妆一个带有UIButtonTypeCustom的按钮(这样你将得到一个没有样式的按钮),然后设置它的框架。尝试一下。 – Pawan

+0

@pawan我试着用'UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom];'来创建按钮,然后设置框架,但我仍然有完全相同的问题。任何其他想法? – Martin

回答

1

你看到的是你的个人资料图像(人脸)流血的边缘。这是因为边框是反锯齿的,因此具有少量透明度,通过该透明度,可以使配置文件图像流血。

由于您将配置文件图像和边框剪切在一起,因此没有任何功能可以阻止配置文件图像通过边框延伸。 (即clipsToBounds不会将内容剪辑到边框内部;它会将所有内容剪切到边框外部)。您可以使用鲜红的图像来证明这一点:您会看到明亮的红色边缘。

如果您可以事先将配置文件图像制作成圆形和正确尺寸(离线或代码),那么您将避免此问题。

我看到的其他解决方案是实现自己的drawRect:方法,并自己进行绘制或创建另一个按钮子层,以保持以相同方式剪裁的图像,但没有边框。 (无论哪种方式,您可能需要使自己的UIControl这个,而不是使用的UIButton,如操纵按钮的层可能会导致怪异的行为。)

编辑:这里有一些其他的解决方案,也:iOS: Rounded rectangle with border bleeds color