UIToolbar에 UILabel 추가


97

내 도구 모음에 레이블을 추가하려고합니다. 버튼은 잘 작동하지만 라벨 객체를 추가하면 충돌이 발생합니다. 어떤 아이디어?

UIBarButtonItem *setDateRangeButton = [[UIBarButtonItem alloc] initWithTitle:@"Set date range"
                                                                       style:UIBarButtonItemStyleBordered
                                                                      target:self
                                                                      action:@selector(setDateRangeClicked:)];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 20, 20)];
label.text = @"test";

[toolbar setItems:[NSArray arrayWithObjects:setDateRangeButton,label, nil]];

// Add the toolbar as a subview to the navigation controller.
[self.navigationController.view addSubview:toolbar];

// Reload the table view
[self.tableView reloadData];

답변:


128

이것 좀 봐

[[UIBarButtonItem alloc] initWithCustomView:yourCustomView];

기본적으로 모든 항목은 "버튼"이어야하지만 필요한 모든보기로 인스턴스화 할 수 있습니다. 다음은 몇 가지 예제 코드입니다. 다른 버튼은 일반적으로 도구 모음에 있으므로 스페이서는 제목 버튼의 양쪽에 배치되어 중앙에 유지됩니다.

NSMutableArray *items = [[self.toolbar items] mutableCopy];

UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:spacer];
[spacer release];

self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0 , 11.0f, self.view.frame.size.width, 21.0f)];
[self.titleLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:18]];
[self.titleLabel setBackgroundColor:[UIColor clearColor]];
[self.titleLabel setTextColor:[UIColor colorWithRed:157.0/255.0 green:157.0/255.0 blue:157.0/255.0 alpha:1.0]];
[self.titleLabel setText:@"Title"];
[self.titleLabel setTextAlignment:NSTextAlignmentCenter];

UIBarButtonItem *spacer2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:spacer2];
[spacer2 release];

UIBarButtonItem *title = [[UIBarButtonItem alloc] initWithCustomView:self.titleLabel];
[items addObject:title];
[title release];

[self.toolbar setItems:items animated:YES];
[items release];

10
이 경로를 선택한 경우 레이블의 스타일을 적절하게 지정해야합니다 (label.backgroundColor = [UIColor clearColor] 등). UIBarButtonItem을 일반 스타일로 초기화하여 비슷한 모양을 만들 수도 있습니다.
wisequark

나는 이것이 정말 오래된 게시물이라는 것을 알고 있지만이 답변에 대해 질문이 있습니다. 이 작업이 완료되면 나중에 titleLabel에 액세스하여 변경할 수있는 방법이 있습니까? 아니면 모든 것이 릴리스 된 이후로 불가능합니까?
라이언

Ryan, UILabel은 아마도 여전히 존재할 것입니다-self.titleLabel입니다. 이 예제에는 UILabel * titleLabel에 대해 선언 및 합성 된 속성이 필요하지만 해당 코드는 표시되지 않습니다. 이 코드를 실행하는 개체 (아마도 UIViewController)에 대한 액세스 권한이 있으면 해당 titleLabel에 액세스 할 수 있습니다. 예를 들어, 뷰 컨트롤러에 메소드를 추가하고 원하는 새 제목을 전달한 다음 [self.titleLabel setText : newTitle]을 호출 할 수 있습니다.
Steve Liddle 2011

7
제목 버튼 표시 줄 항목 뒤에 두 번째 스페이서를 추가하지 않겠습니까?
len

121

인터페이스 빌더를 사용하여를 레이아웃 UIToolBar하는 경우 인터페이스 빌더 만 사용하여이 작업을 수행 할 수도 있습니다.

를 추가하려면 UILabelA를 UIToolBar사용하면 일반적인 추가 할 필요가 UIView당신에 객체를 UIToolBar새로운 드래그하여 IB에 UIView당신을 통해 개체를 UIToolBar. 사용자 정의로 초기화 IB되는 UIBarButtonItem을 자동으로 만듭니다 UIView. 다음은 추가 UILabel받는 UIView및 편집 UILabel그래픽으로 선호하는 스타일에 맞게. 그런 다음 원하는대로 고정 및 / 또는 가변 스페이서를 시각적으로 설정하여 UILabel적절하게 배치 할 수 있습니다.

당신은 또한 모두의 배경 설정해야 UILabel하고,를 UIView위해 clearColor(가) 얻을 UIToolBar세 이하 제대로을 통해 보여 UILabel.


2
인터페이스 빌더에서 할 수 있다는 것을 몰랐습니다. 대단히 감사합니다.
Rafael Bugajewski 2011 년

해당 방법을 사용하여 사용자 정의 이미지로 UIButton을 추가하는 방법이 있습니까? UIButton을 추가 할 수 있지만 이미지가 표시되지 않습니다.
cannyboy 2011 년

4
이 작업을 수행 할 수없는 것 같습니다. UIView를 툴바로 드래그하면 툴바가 아닌 뷰 컨트롤러 내부에 배치됩니다. 또한 내비게이션 컨트롤러 또는 뷰 컨트롤러에서이 작업을 수행합니까?
guptron 2013 년

1
작동하지 않는 것 같습니다. 그것은 ... 엑스 코드 6 더이상 오래 전, 한 번 일 경우
프레데릭 다다

1
뷰 컨트롤러에 수동으로 추가 된 도구 모음에서만 작동한다는 점을 지적하도록 답변을 업데이트해야합니다. 추가 된 도구 모음에서는 작동하지 않습니다.
James Bush

32

answerBot의 답변이 매우 유용하다는 것을 알았지 만 Interface Builder에서 더 쉬운 방법을 찾은 것 같습니다.

  • UIBarButtonItem을 만들고 Interface Builder의 도구 모음에 추가합니다.

여기에 이미지 설명 입력

  • 이 BarButtonItem에 대해 "사용"을 선택 취소하십시오.

여기에 이미지 설명 입력

  • 이 BarButtonItem을 클래스의 속성에 연결합니다 (Swift에 있지만 Obj-C에서는 매우 유사합니다).

    @IBOutlet private weak var lastUpdateButton: UIBarButtonItem! // Dummy barButtonItem whose customView is lastUpdateLabel
  • Label 자체에 대한 다른 속성을 추가합니다.

    private var lastUpdateLabel = UILabel(frame: CGRectZero)
  • viewDidLoad에서 다음 코드를 추가하여 레이블의 속성을 설정하고 BarButtonItem의 customView로 추가합니다.

    // Dummy button containing the date of last update
    lastUpdateLabel.sizeToFit()
    lastUpdateLabel.backgroundColor = UIColor.clearColor()
    lastUpdateLabel.textAlignment = .Center
    lastUpdateButton.customView = lastUpdateLabel
  • UILabel텍스트 를 업데이트하려면 :

    lastUpdateLabel.text = "Updated: 9/12/14, 2:53"
    lastUpdateLabel.sizeToFit() 

결과 :

여기에 이미지 설명 입력

lastUpdateLabel.sizetoFit()라벨 텍스트를 업데이트 할 때마다 전화해야 합니다.


1
나는 당신과 동일한 UIBarButtonItem을 생성하고, 활성화 된 상태로두고, 다음 코드를 사용하여 레이블을 겹쳐 UILabel* label = [[UILabel alloc] init]; label.text = @"Hello"; label.font = [UIFont systemFontOfSize:16]; [label sizeToFit]; self.barItem.customView = label;
Brett Donald

6

나는이 트릭을 사용하고있는 것들 중 하나는 인스턴스를하는 것입니다 UIActivityIndicatorView의 상단에 UIToolBar, 그렇지 않으면 가능하지 않을 것 인 무엇인가. 예를 들어 여기 UIToolBar에 2 UIBarButtonItem, a FlexibleSpaceBarButtonItem, 그리고 또 다른이 UIBarButtonItem있습니다. 나는를 삽입 할 UIActivityIndicatorViewUIToolBar유연한 공간과 최종 (오른쪽) 버튼을 사이에. 그래서 RootViewController나는 다음을 수행합니다.

- (void)viewDidLoad {
[super viewDidLoad];// Add an invisible UIActivityViewIndicator to the toolbar
UIToolbar *toolbar = (UIToolbar *)[self.view viewWithTag:767];
NSArray *items = [toolbar items];

activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 20.0f, 20.0f)];
[activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhite];    

NSArray *newItems = [NSArray arrayWithObjects:[items objectAtIndex:0],[items objectAtIndex:1],[items objectAtIndex:2],
                     [[UIBarButtonItem alloc] initWithCustomView:activityIndicator], [items objectAtIndex:3],nil];
[toolbar setItems:newItems];}

이 코드는 사용자 정의 활동 표시기보기를 사용하여 UIBarButtonItem에 할당 된 메모리를 누출합니다. (활동 표시기의 메모리도 누출되지만 코드 조각의 끝 아래에서 릴리스되고 있다고 가정합니다.
erikprice

3

세부

  • Xcode 10.2.1 (10E1001), Swift 5

전체 샘플

import UIKit

class ViewController: UIViewController {

    private weak var toolBar: UIToolbar?

    override func viewDidLoad() {
        super.viewDidLoad()

        var bounds =  UIScreen.main.bounds
        let bottomBarWithHeight = CGFloat(44)
        bounds.origin.y = bounds.height - bottomBarWithHeight
        bounds.size.height = bottomBarWithHeight
        let toolBar = UIToolbar(frame: bounds)
        view.addSubview(toolBar)

        var buttons = [UIBarButtonItem]()
        buttons.append(UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(ViewController.action)))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .camera, target: self, action: #selector(ViewController.action)))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
        buttons.append(ToolBarTitleItem(text: "\(NSDate())", font: .systemFont(ofSize: 12), color: .lightGray))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action:  #selector(ViewController.action)))
        toolBar.items = buttons

        self.toolBar = toolBar
    }
    @objc func action() { print("action") }
}

class ToolBarTitleItem: UIBarButtonItem {

    init(text: String, font: UIFont, color: UIColor) {
        let label =  UILabel(frame: UIScreen.main.bounds)
        label.text = text
        label.sizeToFit()
        label.font = font
        label.textColor = color
        label.textAlignment = .center
        super.init()
        customView = label
    }
    required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }
}

결과

여기에 이미지 설명 입력


나는 이것을 좋아하지만 TableView가 있으면이 막대로 스크롤됩니다. 어떻게 수정합니까?
Maksim Kniazev

Maxim 안녕하세요. 문제를 이해할 수 없습니다. 얻고 자하는 결과를 설명하십시오.
Vasily Bodnarchuk

좋아, 내가있는 UITableViewController를 사용하고 내가 view.addSubview를 설정 한 경우 (도구 모음!)하고있는 tableView와 스크롤 바는, 나는 그것이 고정 된 바닥 위치를 갖고 싶어 내의 tableview 스크롤
막심 Kniazev

UITableView (대신 UITableViewController)와 함께 UIViewController를 하위 뷰로 사용해야한다고 생각합니다.
Vasily Bodnarchuk

Ok spasibo. 나는 그것을 시도 할 것입니다
Maksim Kniazev

2

Matt RI 사용 인터페이스 빌더와 유사합니다. 하지만 UIWebView내부에 1 개를 넣어서 일부 텍스트는 굵게 표시하고 다른 텍스트는 표시하지 않도록했습니다 (예 : 메일 앱). 그래서

  1. 대신 webview를 추가하십시오.
  2. 불투명 선택 취소
  3. 배경이 선명한 색상인지 확인
  4. 모든 것을 연결 IBOutlet
  5. 아래 html를 사용하여 투명한 배경을 사용하여 도구 모음이 빛나게합니다.

암호:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
NSString *html = [NSString stringWithFormat:@"<html><head><style>body{font-size:11px;text-align:center;background-color:transparent;color:#fff;font-family:helvetica;vertical-align:middle;</style> </head><body><b>Updated</b> 10/11/12 <b>11:09</b> AM</body></html>"];
[myWebView loadHTMLString:html baseURL:baseURL];

1

도구 모음보기에보기를 추가하려면 다음을 시도하십시오.

[self.navigationController.tabBarController.view addSubview:yourView];

1

이 시도:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(140 , 0, 50, 250)];
[label setBackgroundColor:[UIColor clearColor]];
label.text = @"TEXT";
UIView *view = (UIView *) label;
[self.barItem setCustomView:view];

주의 : self.barItemA는 UIBarButtonItem객체 라이브러리에서 첨가하고, 두 구역 사이에가요.

또 다른 방법은 [self.barItem setCustom:view]선 을 제거하고 label(너비) 의 매개 변수를 변경하여 전체 도구 모음을 채우고 코드에서 직접 정렬과 글꼴을 설정하는 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.