如何为UIBarButtonItem添加边框

4

当我处于相同的情况时,我使用分段控件与图像一起显示边框。 - Jageen
@Jageen 是否有更优雅的解决方案吗?顺便说一句,我无法创建只有一个元素的分段控件。 - FrozenHeart
抱歉,我检查了我的代码,我完全按照Kampai的建议完成了。 - Jageen
请查看此答案 https://stackoverflow.com/a/61143130/6108739 - Vladyslav Panchenko
1个回答

8

另一种解决方法是创建UIButton对象并与其层属性进行操作。

我已经做了一些基本设置,看起来像问题中显示的蓝色图像:

enter image description here

viewDidLoad()方法中添加以下代码,还包括<QuartzCore/QuartzCore.h>框架。

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setFrame:CGRectMake(0, 0, 50, 40)];
[button setImage:[UIImage imageNamed:@"settings.png"] forState:UIControlStateNormal];
button.layer.borderWidth = 1.0f;
button.layer.borderColor = [UIColor lightGrayColor].CGColor;
button.layer.cornerRadius = 5.0f;

button.layer.shadowColor = [UIColor lightGrayColor].CGColor;
button.layer.shadowRadius = 4.0f;
button.layer.shadowOpacity = .9;
button.layer.shadowOffset = CGSizeZero;
button.layer.masksToBounds = NO;


UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:button];

self.navigationItem.leftBarButtonItem = leftItem;

增加更多的渐变效果

我找到了一个git帮助文档YIInnerShadowView,你可以看一下,它非常有用。

我使用这些类来制作渐变和阴影,使其看起来像蓝色图像。能够与该图像具有很高的相似性。你可以对这些类进行更多的自定义,以获得所需的精度。

enter image description here

将此库添加到项目中,导入#import "YIInnerShadowView.h"并将代码添加到viewDidLoad()中。

YIInnerShadowView *innerView = [[YIInnerShadowView alloc] initWithFrame:CGRectMake(0, 0, 50, 40)];
innerView.shadowRadius = 1.5;
innerView.cornerRadius = 5;
innerView.shadowMask = YIInnerShadowMaskAll;

innerView.layer.borderColor = [UIColor colorWithRed:0.3843 green:0.6235 blue:0.8156 alpha:1.0].CGColor;
innerView.layer.borderWidth = 1.0;

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setFrame:CGRectMake(0, 0, 50, 40)];
[button setImage:[UIImage imageNamed:@"settings.png"] forState:UIControlStateNormal];
[innerView addSubview:button];

UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:innerView];
self.navigationItem.leftBarButtonItem = leftItem;

我还对YIInnerShadowLayer.m类进行了一些小修改:

- (id)init
{
    self = [super init];
    if (self) {

        self.masksToBounds = YES;
        self.needsDisplayOnBoundsChange = YES;
        self.shouldRasterize = YES;

        // Standard shadow stuff
        [self setShadowColor:[[UIColor colorWithWhite:0 alpha:1] CGColor]];
        [self setShadowOffset:CGSizeMake(0.0f, 1.0f)];
        [self setShadowOpacity:1.0f];
        [self setShadowRadius:5];

        // Causes the inner region in this example to NOT be filled.
        [self setFillRule:kCAFillRuleEvenOdd];

        self.shadowMask = YIInnerShadowMaskAll;

    }
    return self;
}

我能通过界面构建器完成它吗? - FrozenHeart
2
不确定。但是从Nib中查看UIBarButtonItem属性,它并没有为我们提供更多的自定义选项。因此最好通过编程来实现。 - Kampai
2
这是正确的方法。恐怕您无法通过Interface Builder完成此操作。您只需将其放在-(void)viewDidLoad中,紧接着[super viewDidLoad];即可。只需在使用此解决方案的文件中添加#import <QuartzCore/QuartzCore.h>即可。 - Anon
1
@RichaSharma - #import <QuartzCore/QuartzCore.h> 是一个值得注意的点。谢谢。 - Kampai
2
@FrozenHeart,我尽可能地让它与你的相似。请检查已编辑的答案。 - Kampai
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接