Jensen2k
Jensen2k

Reputation: 8408

Making a custom UISegmentControl(sort of)

I've got this mock up:

enter image description here

As you can see, it's a sort of navigation-menu. It's functionality should be the same as a segmented control, and i am going to change the tableView based on the item active.

What would be the easiest way to implement this?

I have started makin my UIView-subclass, but found out that i had to then make a delegate, watch for tap-events and stuff. Is this the best way to do it? Should i subclass UISegmentedControl?

Any other advice?

Please, point me in the right direction. I feel confident in Obj-c, but making these kinds of stuff makes my mind goes crazy.

Upvotes: 0

Views: 270

Answers (1)

Alex
Alex

Reputation: 26859

Conceptually, UISegmentedControl seems like a good choice for this, but I don't think it's quite flexible enough to create the effect you're going for here.

Have you considered putting three UIButton controls inside a custom view? You can customize the images for each button using setBackgroundImage:forState: to get the border style in your mockup. Set the selected property of the pressed button to YES, and UIButton will handle the drawing for you.

You can set up an action method to detect which button was pressed by calling

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

A delegate is just any class that conforms to a protocol you create. So you would create a delegate protocol in your header like this:

@class MyControl; // this is a forward reference to your class, as this must come before the class @interface definition in the header file

@protocol MyControlDelegate <NSObject>

@optional
- (void)myControl:(MyControl *)control didSelectButton:(int)buttonIndex; // replace this method with whatever makes sense for your control

@end

And the delegate is just a property in your MyControl class:

@property (nonatomic, assign) id <MyControlDelegate> delegate; // you use 'assign' instead of 'retain' to prevent retain cycles

And in your button press handlers, for example:

- (void)methodThatHandlesButtonPress { // this is the method you set up in the first code example with addTarget:action:forCotnrolEvents:
    if ([self.delegate respondsToSelector:@selector(myControl:didSelectButton:)])
        [self.delegate myControl:self didSelectButton:0]; // replace as appropriate
}

Now, you just have to have the view controller that contains your control adopt the protocol:

@interface MyViewController : UIViewController <MyControlDelegate> { // etc...

And implement the method:

- (void)myControl:(MyControl *)control didSelectButton:(int)buttonIndex {
    // handle the button press as appropriate
}

Upvotes: 4

Related Questions