'커스텀'에 해당되는 글 1건

  1. 2015.01.07 네비게이션바에 커스텀뷰를 붙일경우의 주의점


제목그대로 네비게이션바에다가 커스텀뷰를 붙이는 방법에는 두가지가 있다.


1. 네비게이션바에서 제공하는 titleView 메소드를 이용하는 방법


UIView *customView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 120.f, 44.f)];

UILabel *lbl = [[UILabel alloc] initWithFrame:CGRectMake(10.f, 10.f, 100.f, 24.f)];

lbl.backgroundColor = [UIColor whiteColor];

lbl.text = @"custom label~";

lbl.font = [UIFont systemFontOfSize:12.f];

customView.backgroundColor = [UIColor blueColor];

[customView addSubview:lbl];


[self.navigationItem setTitleView:customView];


2. 네비게이션바에다가 직접  addSubview로 붙이는 방법


self.customButton = [UIButton buttonWithType:UIButtonTypeSystem];

    [_customButton setTitle:@"Click!" forState:UIControlStateNormal];

    _customButton.frame = CGRectMake(10.f, 10.f, 50.f, 24.f);

    [_customButton addTarget:self action:@selector(clicked:) forControlEvents:UIControlEventTouchUpInside];

    [self.navigationController.navigationBar addSubview:_customButton];

    

    self.iconImageView = [[UIImageView alloc] initWithFrame:CGRectMake(60.f, 0.f, 40.f, 40.f)];

    _iconImageView.image = [UIImage imageNamed:@"hanjimin"];

    [self.navigationController.navigationBar addSubview:_iconImageView];

    

    

    self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(_iconImageView.frame.origin.x + 40.f,

                                                                10.f, 100.f, 24.f)];

    _titleLabel.text = @"jimin jjang!!";

    [_titleLabel sizeToFit];

    _titleLabel.textColor = [UIColor whiteColor];

    _titleLabel.backgroundColor = [UIColor orangeColor];

    [self.navigationController.navigationBar addSubview:_titleLabel];



위의 두가지 방법 다 유효하다. 다만 붙이는 커스텀된 뷰가 레이아웃이 가변적일때(유저조작에 따라 변경되야 할 경우)는 고민을 해 봐야 한다.


이 문제로 3시간 삽질을 했는데 삽질결과 알아낸 사실은..


- 1.번의 방법으로는 레이아웃 변경자체가 안되고 그냥 가운데로 고정이 되버림.


- 2.번의 방법으로 레이아웃은 조정 가능하지만 만약 커스텀뷰 안에 하위 뷰가 존재할 경우 하위 뷰는 레이아웃 변경이 안된다.(오토레이아웃, 오토리사이즈, 코드상 변경 모두 불가)

 네비게이션에 직접 붙인 뷰(하위1단계레벨)만이 레이아웃 조정가능했다.


버튼이벤트에 레이아웃을 움직여보면.. 잘움직인다.


- (void)clicked:(id)sender {

    

    //update layout!

    _iconImageView.frame = CGRectMake(arc4random()%200 + 60.f,

                                      _iconImageView.frame.origin.y,

                                      _iconImageView.frame.size.width,

                                      _iconImageView.frame.size.height);

    

    _titleLabel.frame = CGRectMake(_iconImageView.frame.origin.x + 40.f,

                                   _titleLabel.frame.origin.y,

                                  _titleLabel.frame.size.width,

                                  _titleLabel.frame.size.height);

    

}





결론은..


네비게이션뷰에다가 복수개의 뷰를 붙일경우엔 편의상 컨테이너뷰를 만들고 뷰 하나만 붙이면 된다고 생각하지만 그렇게 되면 레이아웃 조정이 불가능해지므로 따라서 각각 하나하나 붙여야 한다.


예를들어.. 내가 삽질을 하게 된 이유이지만, 네비게이션뷰에 드롭다운 메뉴를 만들고 드롭다운 메뉴에서 선택된 항목으로 인하여 라벨크기가 가변적으로 변해야 한다면 라벨, 버튼, 이미지 각각 따로 붙여야 한다.








Posted by 악당잰 트랙백 0 : 댓글 0

댓글을 달아 주세요