iOS7에서 UITableViewCell의 AccessoryView에 버튼을 배치하고 버튼의 selector에서 cell을 참조하기

아래와 같이 특정 서비스에서 친구를 초대하거나 follow할 때 주로 쓰는 UI화면이 있다. UITableView에 UITableViewCell 혹은 이를 상속받는 클래스 구조인데, 여기서 Invite 버튼을 터치했을 때 버튼이 속하는 NSIndexPath를 받기 위해 아래와 같이 코딩을 할 때가 있다. /* UITableView의 data source 메소드 중 cellForRowAtIndexPath: 메소드 */ – (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (!cell) { UIButton *inviteButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; /* 프로퍼티 정의는 생략 */ [inviteButton addTarget:self action:@selector(onInvite:) forControlEvents:UIControlEventTouchUpInside]; cell.accessoryView = inviteButton; } return cell; } /* Invite 버튼의 selector 메소드 */ – (void)onInvite:(id)sender { if ([sender isKindOfClass:[UIButton class]]) { UIButton *inviteButton = (UIButton *)sender; UITableViewCell *selectedCell = (UITableViewCell *)[inviteButton superview]; NSIndexPath *indexPath = [_tableView indexPathForCell:selectedCell]; NSLog(@"selected row is :%d", indexPath.row); } } 이 경우 onInvite: 메소드의 [inviteButton superview] 가 iOS7 미만에서는 포인터를 가져오는데 문제가 없었지만 iOS7 부터는 문제가 된다. view의 구조를 봤을 때 Invite 버튼은 UITableViewCell의 accesoryView로 대치되었기 때문에 superview는…

다각형의 버튼들 배치

일반적으로 버튼은 rectangle. 즉, 사각형의 영역으로 범위를 정의한다. 하지만 위 스크린샷(노란색과 파란색이 각각 버튼이다.)처럼 종종 다각형(polygon) 형태의 버튼 모양이 디자인으로 나올 수 있고 이를 무조건 rectangle로 만들라고 디자이너에게 요구할 수도 없다. 다각형 버튼 각자의 영역이 겹치지 않는다면 큰 문제가 되지 않지만 여기서 문제는 겹칠 때. 이 때는 respond가 addSubview 메소드를 나중에 호출한 버튼이 호출된다. 당연하다. iOS의 UIView 구조는 포토샵의 레이어와 유사한 구조이다. 이를 해결하기 위해서는 여러가지 방법이 있을 수 있지만 가장 효율적인 방법은 터치한 지점에 해당하는 버튼 이미지의 alpha 값을 가지고와 미리 정해놓은 threshold와 비교해서 response를 return값으로 판단할 수 있다. 이를 충실하게 구현해놓은 Open Source가 있어서 소개한다. https://github.com/ole/OBShapedButton 위 코드는 UIButton을 상속받은 OBShapedButton 클래스와 특정 지점의 Alpha값을 가지고 올 수 있도록 메소드가 정의된 UIImage의 category 클래스가 전부이다. 사용법은 두 클래스를 프로젝트에 추가하고 UIButton으로 정의하던 클래스를 OBShapedButton으로 정의하면 된다. 이 코드는 대부분의 iOS에서 사용할 수 있다. 추가적인 팁으로 화면에 여러 개의 버튼이 배치되었을 때 동시에 버튼들을 누르면 모두 눌러지는 것을 확인할…