programing

사용자 지정 이미지가 있고 테두리가 없는 UIBarButtonItem

minimums 2023. 8. 26. 10:40
반응형

사용자 지정 이미지가 있고 테두리가 없는 UIBarButtonItem

사용자 지정 이미지를 사용하여 UIBarButtonItem을 만들고 싶지만 iPhone이 추가하는 테두리를 원하지 않습니다. 왜냐하면 내 이미지에는 특수 테두리가 있기 때문입니다.

뒤로 버튼과 동일하지만 앞으로 버튼입니다.

이 앱은 사내 프로젝트를 위한 앱이라 애플이 거부하든 승인하든 좋아하든 상관없습니다 :-)

UIBarButtonItem의 initWithCustomView:v 속성을 사용하면 다음 작업을 수행할 수 있습니다.

UIImage *image = [UIImage imageNamed:@"right.png"];

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setBackgroundImage: [image stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateNormal];
[button setBackgroundImage: [[UIImage imageNamed: @"right_clicked.png"] stretchableImageWithLeftCapWidth:7.0 topCapHeight:0.0] forState:UIControlStateHighlighted];

 button.frame= CGRectMake(0.0, 0.0, image.size.width, image.size.height);

[button addTarget:self action:@selector(AcceptData)    forControlEvents:UIControlEventTouchUpInside];

UIView *v=[[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, image.size.width, image.size.height) ];

[v addSubview:button];

UIBarButtonItem *forward = [[UIBarButtonItem alloc] initWithCustomView:v];

self.navigationItem.rightBarButtonItem= forward;

[v release];
[image release];

이 작업은 가능하지만, 이 프로세스를 10개의 보기에서 반복해야 한다면, 이것은 DRY가 아닙니다.

서브클래스를 해야 할 것 같은데, 뭐?

  • NSView?
  • UIBarButtonItem?

감사해요.

안부 전해요,

또 다른 간단한 해결책은

  1. 표준 UI 단추를 끕니다.
  2. 단추의 스타일을 사용자 지정으로 설정하고 해당 단추에 대한 이미지 설정
  3. UIN 탐색 모음으로 끌어다 놓기
  4. 선택기 설정

사용자 정의 범주를 사용하여 메서드를 하위 분류하지 않고 UIBarButtonItem에 추가할 수 있습니다.

@interface UIBarButtonItem(MyCategory)

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action;

@end

@implementation UIBarButtonItem(MyCategory)

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action{
 // Move your item creation code here
}
@end

따라서 코드의 모든 위치에서 이 메서드를 호출하는 막대 항목을 만들 수 있습니다(해당 선언에 헤더를 포함하는 경우).

추신: 생성할 수 있으므로 'v' UIView를 사용할 필요가 없습니다.UIBarButtonItem버튼을 사용자 정의 보기로 직접 설정합니다.
추신: 코드에 [Forward Release]도 필요합니다.

저는 이렇게 하는 것이 쉽죠.그것은 위에 제안됩니다."pg.png"이 프로젝트에 있어야 합니다.아무 이미지나 드래그 앤 드롭하면 됩니다.

 UIButton *a1 = [UIButton buttonWithType:UIButtonTypeCustom];
        [a1 setFrame:CGRectMake(0.0f, 0.0f, 25.0f, 25.0f)];
        [a1 addTarget:self action:@selector(randomMsg) forControlEvents:UIControlEventTouchUpInside];
        [a1 setImage:[UIImage imageNamed:@"config.png"] forState:UIControlStateNormal];
        UIBarButtonItem *random = [[UIBarButtonItem alloc] initWithCustomView:a1];

 //? line incomplete ?//   imageNamed:@"random.png"] style:UIBarButtonItemStylePlain target:self action:@selector(randomMsg)];

    self.navigationItem.rightBarButtonItem = random;

또는 하위 클래스 UIBarButtonItem을 사용할 수 있습니다.왜죠? 올바른 발신인을 사용하여 대상에서 작업이 호출됩니다.위의 코드에서 작업 메시지의 보낸 사람 인수는 UIBarButtonItem 인스턴스가 아니라 UIButton 인스턴스입니다.이는 예를 들어 막대 단추 항목에서 UIPopoverController를 표시하려는 경우에 중요합니다.UIBarButtonItem을 하위 분류하면 원래 대상을 유지하는 ivar를 추가하여 하위 클래스 인스턴스가 적절한 보낸 사람과 함께 작업 메시지를 가로채고 수정하고 전달할 수 있습니다.

자, CCF 바 버튼 아이템.h:

#import <uIKit/UIBarButtonItem.h>

@interface CCFBarButtonItem : UIBarButtonItem
{
@protected
    id _originalTarget;
}
- (id)initWithImage:(UIImage *)image target:(id)target action:(SEL)action;
@end

및 CCF 막대 단추 항목.

#import "CCFBarButtonItem.h"
#import <UIKit/UIButton.h>
#import <UIKit/UIView.h>
#import <UIKit/UIImage.h>

@implementation CCFBarButtonItem

#pragma mark - Object life cycle

- (id)initWithImage:(UIImage *)image target:(id)target action:(SEL)action;
{
    _ASSIGN( _originalTarget, target );

    UIButton *imgButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [imgButton setImage:image forState:UIControlStateNormal];
    imgButton.frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height);
    [imgButton addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];

    self = [super initWithCustomView:imgButton];

    return self;
}

- (void)dealloc;
{
    MCRelease(_originalTarget);
    [super dealloc];
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector;
{
    if( [_originalTarget respondsToSelector:aSelector] )
    {
        return [_originalTarget methodSignatureForSelector:aSelector];
    }
    else
    {
        return [super methodSignatureForSelector:aSelector];
    }
}

- (void)forwardInvocation:(NSInvocation *)anInvocation;
{
    SEL aSelector = [anInvocation selector];
    if( [_originalTarget respondsToSelector:aSelector] )
    {
        //  modify the 'sender' argument so that it points to self
        [anInvocation setArgument:&self atIndex:2];
        [anInvocation invokeWithTarget:_originalTarget];
    }
    else
    {
        [self doesNotRecognizeSelector:aSelector];
    }
}
@end
UIBarButtonItem *menuItem = [[UIBarButtonItem alloc] initWithImage: [UIImage imageNamed:@"icon-menu.png"]
                                                                    style:UIBarButtonItemStylePlain
                                                                   target:self
                                                                   action:@selector(showMenu)];

이는 프로그래밍 방식으로도 수행할 수 있습니다(물론).

먼저 사용자 정의 보기를 만듭니다.이 사용자 정의 보기에는 이미지, 단추 또는 원하는 다른 항목이 포함될 수 있습니다.사용자 정의 보기는 프로그래밍 방식으로 또는 IB에서 만들 수 있습니다.

UIImage *customImage = [UIImage imageNamed:@"imageName"];
UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, customImage.size.width, customImage.size.height)];
customView.backgroundColor = [UIColor colorWithPatternImage:customImage];

그런 다음 UIBarButtonItem을 생성하고 사용자 정의 보기로 초기화합니다.

UIBarButtonItem *customBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customView];

이제 사용자 정의 UIBarButton을 왼쪽 BarButtonItem에 추가하기만 하면 됩니다.

self.navigationItem.leftBarButtonItem = customBarButtonItem;

네, 그 카테고리는 Popover 컨트롤러에 문제가 없기 때문에 매우 잘 작동합니다 :-)

#import <UIKit/UIKit.h>

@interface UIBarButtonItem (BarButtonItemExtended)
+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action;
-(void)performBarButtonAction:(id)sender;
@end



#import "UIBarButtonItem+BarButtonItemExtended.h"

@implementation UIBarButtonItem (BarButtonItemExtended)

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action
{    
    UIButton *imgButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [imgButton setImage:image forState:UIControlStateNormal];
    imgButton.frame = CGRectMake(0.0, 0.0, image.size.width, image.size.height);

    UIBarButtonItem *b = [[UIBarButtonItem alloc]initWithCustomView:imgButton];

    [imgButton addTarget:b action:@selector(performBarButtonAction:) forControlEvents:UIControlEventTouchUpInside];

    [b setAction:action];
    [b setTarget:target];

    return b;
}

-(void)performBarButtonAction:(UIButton*)sender
{
    [[self target] performSelector:self.action withObject:self];
}
@end

또 다른 해결책은 버튼을 프로그래밍 방식으로 만들 때 더 간단하다고 생각합니다.

UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithImage:defaultImage
                                             landscapeImagePhone:landscapeImage
                                                           style:UIBarButtonItemStylePlain
                                                          target:self
                                                          action:@selector(someSelector)];
[button setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[button setBackgroundImage:[UIImage new] forState:UIControlStateNormal barMetrics:UIBarMetricsLandscapePhone];

이 간단한 해결책을 확인해 보세요.

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
barButtonItem.image = [UIImage imageNamed:@"navButton.png"];
barButtonItem.style = UIBarButtonItemStylePlain;

[barButtonItem setBackgroundImage:[UIImage imageNamed:@"1x1.png"] forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
[self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];
self.masterPopoverController = popoverController;
}

여기서 1x1.png는 아래 링크에서 다운로드할 수 있는 1픽셀 투명 png 이미지입니다.

http://commons.wikimedia.org/wiki/File:1x1.png

언급URL : https://stackoverflow.com/questions/2681321/uibarbuttonitem-with-custom-image-and-no-border

반응형