문제

나는 "뒤로"왼손잡이-벨 버튼을 만들고 싶습니다. UIToolbar.

내가 알 수있는 한,이 중 하나를 얻는 유일한 방법은 UINavigationController 기본 설정에서 왼쪽 막대 항목에 하나를 사용합니다. 하지만 내가 찾을 수있는 방법은 없습니다. UIBarButtonItem, 그래서 나는 표준에서 하나를 만들 수 없습니다 UIToolbar, 비록 그들이 매우 비슷하지만 UINavigationBar에스.

버튼 이미지로 수동으로 만들 수는 있지만 어디서나 소스 이미지를 찾을 수 없습니다. 알파 채널 가장자리가 있으므로 스크린 샷 및 절단은 매우 다양한 결과를 얻지 못합니다.

내가 사용하려는 모든 크기와 색 구성표에 대한 스크린 샷 이외의 아이디어가 있습니까?

업데이트: 질문을 피하고 내가 이것을 묻지 말아야한다고 제안하고 사용해야한다고 제안합니다. UINavigationBar. 내 앱은 Instapaper Pro입니다. 하단 도구 모음 만 표시하고 (공간을 절약하고 읽을 수있는 컨텐츠 영역을 최대화하기 위해) 왼쪽 화살표 모양의 백 버튼을 하단에 넣고 싶습니다.

내가 이것을 할 필요가 없다고 말해 답이 아닙니다 그리고 확실히 현상금을받을 자격이 없습니다.

도움이 되었습니까?

해결책

내가 파생 한 다음 PSD를 사용했습니다 http://www.teehanlax.com/blog/?p=447

http://www.chrisandtennille.com/pictures/backbutton.psd

그런 다음 도구 모음 항목의 CustomView 속성에서 사용하는 사용자 정의 UIView를 만들었습니다.

나를 위해 잘 작동합니다.


편집하다: 지적한대로 프레리 히포, Maralbjo 다음을 사용하여 간단한 코드를 사용하면 트릭 (번들의 사용자 정의 이미지가 필요) 이이 답과 결합되어야한다는 것을 발견했습니다. 다음은 다음과 같은 추가 코드입니다.

// Creates a back button instead of default behaviour (displaying title of previous screen)
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"]
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(backAction)];

tipsDetailViewController.navigationItem.leftBarButtonItem = backButton;
[backButton release];

다른 팁

유니 코드 방법

유니 코드 문자를 사용하여 작업을 완료하는 것이 훨씬 쉽다고 생각합니다. 인터넷 검색을 통해 화살표를 볼 수 있습니다 유니 코드 삼각형 또는 유니 코드 화살표. iOS6에서 시작하여 Apple은 캐릭터를 테두리를 가진 이모티콘 캐릭터로 변경했습니다. 테두리를 비활성화하려면 0xfe0e를 추가합니다 유니 코드 변형 선택기.

NSString *backArrowString = @"\U000025C0\U0000FE0E"; //BLACK LEFT-POINTING TRIANGLE PLUS VARIATION SELECTOR

UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:backArrowString style:UIBarButtonItemStylePlain target:nil action:nil];
self.navigationItem.leftButtonItem = backBarButtonItem;

코드 블록은 데모를위한 것입니다. NSString을 수용하는 버튼으로 작동합니다.

전체 문자 목록은 Google에서 유니 코드 문자와 원하는 것을 검색합니다. 다음은 항목입니다 검은 왼쪽 포인팅 삼각형.

결과

The result

경고: iOS 6에서는 작동하지 않을 것이라는보고가 있습니다. 이것은 이전 버전의 OS에서만 작동 할 수 있습니다. 적어도 하나의 Dev 가이 트릭을 사용하는 데 앱을 거부 한 것 같습니다 (주석 참조). 자신의 위험에 사용하십시오. 이미지를 사용하여 (위의 답변 참조) 더 안전한 솔루션 일 수 있습니다.

SEKR1T 버튼 유형 101을 사용하여 자신의 이미지 파일을 추가하지 않고도 올바른 모양을 얻을 수 있습니다. 나에게 트릭은 내가 사용할 수 있다는 것을 알아내는 것이 었습니다. initWithCustomView 만들기 위해 BarButtonItem. 나는 개인적 으로이 이것을 toolbar, 그러나 나는 도구 모음으로 테스트했으며 코드는 거의 동일합니다.

// create button
UIButton* backButton = [UIButton buttonWithType:101]; // left-pointing shape!
[backButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
[backButton setTitle:@"Back" forState:UIControlStateNormal];

// create button item -- possible because UIButton subclasses UIView!
UIBarButtonItem* backItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];

// add to toolbar, or to a navbar (you should only have one of these!)
[toolbar setItems:[NSArray arrayWithObject:backItem]];
navItem.leftBarButtonItem = backItem;

도구 모음 에서이 작업을 수행하면 항목을 설정하는 방법을 조정해야하지만 이는 코드의 나머지 부분에 따라 다르며 리더를위한 연습으로 남겨 둡니다. : p이 샘플은 저를 위해 작동했습니다 (컴파일 및 실행).

Blah Blah, Hig를 읽고, 문서화되지 않은 기능을 사용하지 마십시오. 지원되는 버튼 유형은 6 가지 뿐이며 그 중 하나가 아닙니다.

enter image description here

우선 백 버튼의 이미지를 찾아야합니다. 나는 멋진 앱을 사용했다 추출기 iPhone에서 모든 그래픽을 추출합니다. ~ 안에 IOS 7 나는 호출 된 이미지를 검색 할 수있었습니다 UINavigationBarBackIndicatorDefault 그리고 빨간 색조가 필요했기 때문에 검은 색이었습니다. 김프를 사용하여 색상을 빨간색으로 변경합니다.

편집하다:

언급했듯이 btate 그의 의견에서, 이미지 편집기로 색상을 변경할 필요가 없습니다. 다음 코드는 트릭을 수행해야합니다.

imageView.tint = [UIColor redColor];
imageView.image = [[UIImage imageNamed:@"UINavigationBarBackIndicatorDefault"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

그런 다음 해당 화살표가 포함 된 ImageView, 사용자 정의 텍스트가있는 레이블 및보기 위에는 동작이있는 버튼이 포함 된 뷰를 만들었습니다. 그런 다음 간단한 애니메이션 (페이딩 및 번역)을 추가했습니다.

다음 코드는 애니메이션을 포함하여 뒤로 버튼의 동작을 시뮬레이션합니다.

-(void)viewWillAppear:(BOOL)animated{
        UIImageView *imageView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBarBackIndicatorDefault"]];
        [imageView setTintColor:[UIColor redColor]];
        UILabel *label=[[UILabel alloc] init];
        [label setTextColor:[UIColor redColor]];
        [label setText:@"Blog"];
        [label sizeToFit];

        int space=6;
        label.frame=CGRectMake(imageView.frame.origin.x+imageView.frame.size.width+space, label.frame.origin.y, label.frame.size.width, label.frame.size.height);
        UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0, label.frame.size.width+imageView.frame.size.width+space, imageView.frame.size.height)];

        view.bounds=CGRectMake(view.bounds.origin.x+8, view.bounds.origin.y-1, view.bounds.size.width, view.bounds.size.height);
        [view addSubview:imageView];
        [view addSubview:label];

        UIButton *button=[[UIButton alloc] initWithFrame:view.frame];
        [button addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];
        [view addSubview:button];

        [UIView animateWithDuration:0.33 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{
            label.alpha = 0.0;
            CGRect orig=label.frame;
            label.frame=CGRectMake(label.frame.origin.x+25, label.frame.origin.y, label.frame.size.width, label.frame.size.height);
            label.alpha = 1.0;
            label.frame=orig;
        } completion:nil];

        UIBarButtonItem *backButton =[[UIBarButtonItem alloc] initWithCustomView:view];
}

- (void) handleBack:(id)sender{
}

편집하다:

버튼을 추가하는 대신 내 의견으로는 더 나은 접근 방식은 제스처 인식기를 사용하는 것입니다.

UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleBack:)];
[view addGestureRecognizer:tap];
[view setUserInteractionEnabled:YES];

이것이 효과가 있는지 확실하지 않지만 당신은 UINavigationController 기본 설정으로 버튼을 만들려면 탐색 컨트롤러의 하위 뷰에서 버튼을 찾으십시오. removeFromSuperview 이에 네비게이션 컨트롤러를 파괴 한 다음 툴바의 하위 뷰로 버튼을 추가하십시오. 당신은 또한 필요할 수도 있습니다 retain 그리고 전화하기 전에 버튼 removeFromSuperview (그리고 release 프로세스 중에 거래를 피하기 위해 도구 모음의 하위 뷰로 추가 한 후).

iOS 7 시스템 백 화살표에 화살표가있는 Uibutton을 꽤 가깝게 만들기 위해 (저는 디자이너가 아닙니다;) :

기준:

Standard system back arrow

Apple SD Gothic Neo

Apple SD Gothic Neo < character

Xcode에서 :

  • 버튼의 제목 값 필드 (또는 텍스트 콘텐츠가 포함 된 기타보기/제어)에 중점을 둡니다.
  • 편집 -> 특수 문자 열기
  • 괄호 그룹을 선택하고 '<'문자를 두 번 클릭하십시오.
  • 글꼴 변경 : Apple SD Gothic Neo, 원하는 크기가있는 일반 (예 : 20)
  • 원하는대로 색상을 변경하십시오

심판 @staticVoidman의 답변 iOS 7의 백과 같은 화살표

back arrow

이미지 파일을 귀찮게하지 않으려면 다음 코드와 함께 화살표 모양을 UIView 하위 클래스로 그릴 수 있습니다.

- (void)drawRect:(CGRect)rect {
    float width = rect.size.width;
    float height = rect.size.height;
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextBeginPath(context);
    CGContextMoveToPoint(context, width * 5.0/6.0, height * 0.0/10.0);
    CGContextAddLineToPoint(context, width * 0.0/6.0, height * 5.0/10.0);
    CGContextAddLineToPoint(context, width * 5.0/6.0, height * 10.0/10.0);
    CGContextAddLineToPoint(context, width * 6.0/6.0, height * 9.0/10.0);
    CGContextAddLineToPoint(context, width * 2.0/6.0, height * 5.0/10.0);
    CGContextAddLineToPoint(context, width * 6.0/6.0, height * 1.0/10.0);
    CGContextClosePath(context);

    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
    CGContextFillPath(context);
}

화살표보기가 너비 6.0에 비례하고 높이 10.0에 비례합니다.

    self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem;

나를 위해 일합니다. 더 많은 탭이있을 때 이것을 사용한 다음 탭 막대에 맞출 수 있었고, "more"에서 눌린 뷰 컨트롤러는 viewDidload에서 LeftBarButtonItem을 무시했습니다.

uikit $ {sdkroot} /system/library/frameworks/uikit.framework/other.artwork에서 Other.artwork에서 추출하여 소스 이미지를 찾을 수 있습니다. 모딩 커뮤니티에는 추출을위한 몇 가지 도구가 있습니다. 여기. 이미지를 추출한 후에는 필요한 코드를 작성하여 필요한 것으로 다시 작성하여 버튼 이미지로 설정할 수 있습니다. 실제로 그런 물건을 배송 할 수 있는지 여부 (파생 예술 작품을 포함시키기 때문에)는 약간의 황색 일 수 있으므로 변호사와 대화하고 싶을 수도 있습니다.

Three20 라이브러리에는 다음과 같은 방법이 있습니다.

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle: @"Title" style:UIBarButtonItemStylePlain 
                                                                target:self action:@selector(foo)];

  UIColor* darkBlue = RGBCOLOR(109, 132, 162);

  TTShapeStyle* style = [TTShapeStyle styleWithShape:[TTRoundedLeftArrowShape shapeWithRadius:4.5] next:
    [TTShadowStyle styleWithColor:RGBCOLOR(255,255,255) blur:1 offset:CGSizeMake(0, 1) next:
    [TTReflectiveFillStyle styleWithColor:darkBlue next:
    [TTBevelBorderStyle styleWithHighlight:[darkBlue shadow]
                                     shadow:[darkBlue multiplyHue:1 saturation:0.5 value:0.5]
                                      width:1 lightSource:270 next:
    [TTInsetStyle styleWithInset:UIEdgeInsetsMake(0, -1, 0, -1) next:
    [TTBevelBorderStyle styleWithHighlight:nil shadow:RGBACOLOR(0,0,0,0.15)
                                        width:1 lightSource:270 next:nil]]]]]];

  TTView* view = [[[TTView alloc] initWithFrame:CGRectMake(0, 0, 80, 35)] autorelease];
  view.backgroundColor = [UIColor clearColor];
  view.style = style;
  backButton.customView = view;


  self.navigationItem.leftBarButtonItem = backButton;

다음과 같은 간단한 코드를 사용하여 트릭을 수행했다는 것을 알았습니다 (번들의 사용자 정의 이미지가 필요).

// Creates a back button instead of default behaviour (displaying title of previous screen)
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"]
                                                                   style:UIBarButtonItemStyleBordered
                                                                  target:self
                                                                  action:@selector(backAction)];

    tipsDetailViewController.navigationItem.leftBarButtonItem = backButton;
    [backButton release];

이 모든 솔루션과 다른 솔루션을 검색 한 후에 내가 한 일은 다음과 같습니다. Uikit 스톡 이미지에서 추출 된 신축성 PNG를 사용합니다. 이렇게하면 텍스트를 당신이 거짓말을하는 것에 대해 텍스트를 설정할 수 있습니다.

// Generate the background images
UIImage *stretchableBackButton = [[UIImage imageNamed:@"UINavigationBarDefaultBack.png"] stretchableImageWithLeftCapWidth:14 topCapHeight:0];
UIImage *stretchableBackButtonPressed = [[UIImage imageNamed:@"UINavigationBarDefaultBackPressed.png"] stretchableImageWithLeftCapWidth:13 topCapHeight:0];
// Setup the UIButton
UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom];
[backButton setBackgroundImage:stretchableBackButton forState:UIControlStateNormal];
[backButton setBackgroundImage:stretchableBackButtonPressed forState:UIControlStateSelected];
NSString *buttonTitle = NSLocalizedString(@"Back", @"Back");
[backButton setTitle:buttonTitle forState:UIControlStateNormal];
[backButton setTitle:buttonTitle forState:UIControlStateSelected];
backButton.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 2, 1); // Tweak the text position
NSInteger width = ([backButton.titleLabel.text sizeWithFont:backButton.titleLabel.font].width + backButton.titleEdgeInsets.right +backButton.titleEdgeInsets.left);
[backButton setFrame:CGRectMake(0, 0, width, 29)];
backButton.titleLabel.font = [UIFont boldSystemFontOfSize:13.0f];
[backButton addTarget:self action:@selector(yourSelector:) forControlEvents:UIControlEventTouchDown];
// Now add the button as a custom UIBarButtonItem
UIBarButtonItem *backButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:backButton] autorelease];
self.navigationItem.leftBarButtonItem = backButtonItem;

쉽게 할 수 있습니다 인터페이스 빌더 안에 xcode 5.x

Result

  • 사용 도구 모음 그리고 막대 버튼 항목 ~에서 객체 라이브러리

    Components

  • 버튼에 속성 검사관 편집하다 영상 섹션 당신의 뒤로 버튼 이미지

    Attributes inspector

완료!

나는 똑같은 일을하려고했지만 뒤로 버튼이 탐색 막대에 있기를 원했습니다. (실제로 백 버튼이 필요했는데, 그것은 단지 돌아가는 것 이상을 할 수 있었으므로 Leftbarbuttonitem 속성을 사용해야했습니다). 나는 Andrews가 제안한 것을 시도했지만 내비게이션 바에서 Uibartton이 Uibarbuttonitem에 캐스팅 되었기 때문에 그렇게 보지 않을 것입니다.

그러나 나는 이것을 해결하는 방법을 찾았습니다. 나는 실제로 UIBITTON 아래에 UIVIEW를 넣고 UibarButtonitem의 CustomView를 설정했습니다. 누군가가 필요한 경우 코드는 다음과 같습니다.

// initialize button and button view
UIButton *backButton = [UIButton buttonWithType:101];
UIView *backButtonView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, backButton.frame.size.width, backButton.frame.size.height)];

[backButton addTarget:self action:@selector(backButtonTouched:) forControlEvents:UIControlEventTouchUpInside];
[backButton setTitle:@"Back" forState:UIControlStateNormal];
[backButtonView addSubview:backButton];

// set buttonview as custom view for bar button item
UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButtonView];
self.navigationItem.leftBarButtonItem = backButtonItem;

// push item to navigationbar items
[self.navigationController.navigationBar setItems:[NSArray arrayWithObject:backButtonItem]];

uitoolbar의 이미지를 만들려면 Photoshop에서 PNG를 만들고 색상이있는 곳이면 흰색을 넣고 Alpha = 0 인 경우 혼자 남겨 두십시오.

SDK는 실제로 당신이 만든 아이콘 주위에 테두리를 넣고 아무것도하지 않고 흰색으로 바꿉니다.

참조, 이것이 포워드 버튼을 위해 Photoshop에서 만든 것입니다 (분명히 뒤로 버튼으로 바꾸는 것).

http://twitpic.com/1oanv

그리고 이것은 인터페이스 빌더에서처럼 보이는 것입니다.

http://twitpic.com/1oaoa

PNG를 사용하지 않고 솔루션. 이에 따라 답변을 바탕으로 : iPhone TableView 셀의 셀 오른쪽에 작은 화살표를 추가

uitableviewcell을 가로로 뒤집습니다!

UIButton *btnBack = [[UIButton alloc] initWithFrame:CGRectMake(0, 5, 70, 20)];

// Add the disclosure
CGRect frm;
UITableViewCell *disclosure = [[UITableViewCell alloc] init];
disclosure.transform = CGAffineTransformScale(CGAffineTransformIdentity, -1, 1);
frm = self.btnBack.bounds;
disclosure.frame = CGRectMake(frm.origin.x, frm.origin.y, frm.size.width-25, frm.size.height);
disclosure.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
disclosure.userInteractionEnabled = NO;
[self.btnBack addSubview:disclosure];

// Add the label
UILabel *lbl = [[UILabel alloc] init];
frm = CGRectOffset(self.btnBack.bounds, 15, 0);
lbl.frame = frm;
lbl.textAlignment = NSTextAlignmentCenter;
lbl.text = @"BACK";
[self addSubview:lbl];

직접 그리지 않으려면 문서화되지 않은 클래스 : UinavigationButton을 사용하여 스타일 1을 사용할 수 있습니다. 물론 응용 프로그램이 승인되지 않도록 중단 할 수 있습니다 ... /John

글쎄, 당신은 모든 크기에 대해 다른 버튼을 가질 필요가 없으며, 당신은 사용할 수 있습니다. [UIImage stretchableImageWithLeftCapWidth:topCapHeight:], 그러나 내가 찾은 유일한 것은 사용자 정의 이미지입니다.

나는 비슷한 문제가 있었고 하나의 도서관에서 나옵니다. Pbutton. 그리고 샘플은 다시 탐색 버튼으로 버튼으로 사용자 정의 버튼처럼 어디서나 사용할 수 있습니다.

이 같은:enter image description here

Swift 3의 예, 오른쪽 상단에 이전 및 다음 버튼이 있습니다.

let prevButtonItem = UIBarButtonItem(title: "\u{25C0}", style: .plain, target: self, action: #selector(prevButtonTapped))
let nextButtonItem = UIBarButtonItem(title: "\u{25B6}", style: .plain, target: self, action: #selector(nextButtonTapped))
self.navigationItem.rightBarButtonItems = [nextButtonItem, prevButtonItem]

빠른

// create button
    var backButton = UIButton(type: 101)

    // left-pointing shape!
    backButton.addTarget(self, action: #selector(self.backAction), for: .touchUpInside)
    backButton.setTitle("Back", for: .normal)

    // create button item -- possible because UIButton subclasses UIView!
    var backItem = UIBarButtonItem(customView: backButton)

    // add to toolbar, or to a navbar (you should only have one of these!)
    toolbar.items = [backItem]
    navItem.leftBarButtonItem = backItem

이 시도. 나는 당신이 그러한 것을 만들기 위해 뒤로 버튼 이미지가 필요하지 않다고 확신합니다.

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(yourSelectorGoesHere:)];
self.navigationItem.backBarButtonItem = backButton;

그게 당신이해야 할 전부입니다 :)

왜 이런 짓을하는? 탐색 표시 줄처럼 보이는 것을 원한다면 uinavigationbar를 사용하십시오.

툴바에는 특정 시각적 스타일이 관련되어 있습니다. iPhone 상태의 휴먼 인터페이스 지침 :

도구 모음은 화면의 하단 가장자리에 나타나며 현재보기에서 객체와 관련된 동작을 수행하는 버튼이 포함되어 있습니다.

그런 다음 텍스트가없는 대략 정사각형 아이콘의 몇 가지 시각적 예를 제공합니다. 나는 당신이 이것에 대한 히그를 따르도록 촉구합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top