Мне нужно добавить элементы checkbox в мою форму. Я знаю, что такого контроля в IOS SDK нет. Как я могу это сделать?
Флажок в приложении iOS
Ответ 1
это тоже меня смутило, и я нашел другое решение, которое хорошо работает для меня и позволяет избежать использования изображений.
- Добавить новый объект метки в Interface Builder.
 - Создайте свойство IBOutlet в Xcode и подключите его к нему. В приведенном ниже коде я назвал его "fullPaid" , поскольку я хочу знать, заплатил ли кто-нибудь полностью денежную сумму.
 - Добавьте 2 функции ниже. Функция "touchhesBegan" проверяет, если вы коснулись где-то внутри объекта метки "fullPaid" , и если это так, он вызывает функцию "togglePaidStatus". Функция togglePaidStatus устанавливает две строки, которые имеют символы Unicode, представляющие пустое поле (\ u2610) и отмеченное поле (\ u2611) соответственно. Затем он сравнивает то, что в настоящее время находится в объекте "fullPaid" , и переключает его с другой строкой.
 
Вы можете вызвать функцию togglePaidStatus в функции viewDidLoad, чтобы первоначально установить ее на пустую строку.
Очевидно, вы можете добавить дополнительные проверки, чтобы запретить пользователям включать этот флажок, если метка не включена, но не показана ниже.
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];   
    if (CGRectContainsPoint([fullyPaid frame], [touch locationInView:self.view]))
    {
        [self togglePaidStatus];
    }
}
-(void) togglePaidStatus
{
    NSString *untickedBoxStr = [[NSString alloc] initWithString:@"\u2610"];
    NSString *tickedBoxStr = [[NSString alloc] initWithString:@"\u2611"];   
    if ([fullyPaid.text isEqualToString:tickedBoxStr])
    {
        fullyPaid.text = untickedBoxStr;
    }
    else
    {
        fullyPaid.text = tickedBoxStr;
    }
    [tickedBoxStr release];
    [untickedBoxStr release];
}
		Ответ 2
Как правило, вы должны использовать UISwitch для функциональности, подобной флажку.
Вы можете катиться самостоятельно, используя элемент управления изображением с двумя изображениями (отмеченный/непроверенный) и переключение изображений, когда они касаются элемента управления/
Ответ 3
Если вы показываете группу параметров, и пользователь может выбрать один из них, используйте таблицу с дополнительным флажком и другим цветом текста в выбранной строке.
Если у вас есть один вариант, лучше всего использовать переключатель. Если вы не можете или не хотите, используйте кнопку, установив нормальное изображение в пустое поле и выбранное изображение в отмеченное поле. Вам нужно будет сделать эти два изображения самостоятельно или найти запасную графику, чтобы использовать для них.
Ответ 4
Расширяясь до идеи Adrean, я достиг этого, используя очень простой подход. 
Моя идея - изменить кнопку (скажем, checkBtn) в зависимости от ее состояния, а затем изменить состояние кнопки в IBAction. 
Ниже приведен код, как я это сделал:
- (void)viewDidLoad
{
    [super viewDidLoad];
    [checkBtn setTitle:@"\u2610" forState:UIControlStateNormal];    // uncheck the button in normal state
    [checkBtn setTitle:@"\u2611" forState:UIControlStateSelected];  // check the button in selected state
}
- (IBAction)checkButtonTapped:(UIButton*)sender {
    sender.selected = !sender.selected;    // toggle button selected state  
    if (sender.state == UIControlStateSelected) {    
        // do something when button is checked 
    } else {
        // do something when button is unchecked
    }
}
		Ответ 5
Я хотел сделать это программно, а также решить проблему, которая была слишком маленькой. Это адаптировано из различных источников, в том числе Майка и Майка, комментатора Аги.
В заголовке
@interface YourViewController : UIViewController {
    BOOL checkboxSelected;
    UIButton *checkboxButton;
}
@property BOOL checkboxSelected;;
@property (nonatomic, retain) UIButton *checkboxButton;
-(void)toggleButton:(id)sender;
И в вашей реализации
// put this in your viewDidLoad method. if you put it somewhere else, you'll probably have to change the self.view to something else
// create the checkbox. the width and height are larger than actual image, because we are creating the hit area which also covers the label
UIButton* checkBox = [[UIButton alloc] initWithFrame:CGRectMake(100, 60,120, 44)];  
[checkBox setImage:[UIImage imageNamed:@"checkbox.png"] forState:UIControlStateNormal];
// uncomment below to see the hit area
// [checkBox setBackgroundColor:[UIColor redColor]];
[checkBox addTarget:self action:@selector(toggleButton:) forControlEvents: UIControlEventTouchUpInside];
// make the button image flush left, and then push the image 20px left
[checkBox setContentHorizontalAlignment:UIControlContentHorizontalAlignmentLeft];
[checkBox setImageEdgeInsets:UIEdgeInsetsMake(0.0, 20.0, 0.0, 0.0)];
[self.view addSubview:checkBox];
// add checkbox text text
UILabel *checkBoxLabel = [[UILabel alloc] initWithFrame:CGRectMake(140, 74,200, 16)];
[checkBoxLabel setFont:[UIFont boldSystemFontOfSize:14]];
[checkBoxLabel setTextColor:[UIColor whiteColor]];
[checkBoxLabel setBackgroundColor:[UIColor clearColor]];
[checkBoxLabel setText:@"Checkbox"];
[self.view addSubview:checkBox];
// release the buttons
[checkBox release];
[checkBoxLabel release];
И добавьте этот метод тоже:
- (void)toggleButton: (id) sender
{
    checkboxSelected = !checkboxSelected;
    UIButton* check = (UIButton*) sender;
    if (checkboxSelected == NO)
        [check setImage:[UIImage imageNamed:@"checkbox.png"] forState:UIControlStateNormal];
    else
        [check setImage:[UIImage imageNamed:@"checkbox-checked.png"] forState:UIControlStateNormal];
}
		Ответ 6
Вот моя версия флажка для iphone.
Это один класс, который расширяет UIButton. Это просто, поэтому я буду вставлять его здесь.
Содержимое файла CheckBoxButton.h
#import <UIKit/UIKit.h>
@interface CheckBoxButton : UIButton
@property(nonatomic,assign)IBInspectable BOOL isChecked;
@end
Содержимое файла CheckBoxButton.m
#import "CheckBoxButton.h"
@interface CheckBoxButton()
@property(nonatomic,strong)IBInspectable UIImage* checkedStateImage;
@property(nonatomic,strong)IBInspectable UIImage* uncheckedStateImage;
@end
@implementation CheckBoxButton
-(id)init
{
    self = [super init];
    if(self)
    {
        [self addTarget:self action:@selector(switchState) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}
-(id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if(self)
    {
        [self addTarget:self action:@selector(switchState) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if(self)
    {
        [self addTarget:self action:@selector(switchState) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}
-(void)setIsChecked:(BOOL)isChecked
{
    _isChecked = isChecked;
    if(isChecked)
    {
        [self setImage:self.checkedStateImage forState:UIControlStateNormal];
    }
    else
    {
        [self setImage:self.uncheckedStateImage forState:UIControlStateNormal];
    }
}
-(void)switchState
{
    self.isChecked = !self.isChecked;
    [self sendActionsForControlEvents:UIControlEventValueChanged];
}
@end
Вы можете установить изображения для отмеченного/непроверенного, а также свойства isChecked в инспекторе атрибутов визуальной студии.
 
Чтобы добавить CheckBoxButton в раскадровку или xib, просто добавьте UIButton и установите собственный класс, как на следующем изображении.
 
отправит событие UIControlEventValueChanged, каждый раз при изменении состояния isChecked.
Ответ 7
Кодекс Everyones здесь очень длинный, немного грязный, и его можно было сделать намного проще. У меня есть проект GitHub для подкласса UIControl, который вы можете загрузить и проверить, и дает вам почти собственный элемент пользовательского интерфейса:
Ответ 8
Мне нравится идея Адриана использовать символы, а не изображения. Но я не люблю коробку, ей нужна только сама галочка (@ "\ u2713" ). Я рисую коробку (закругленную коробку) программно и размещаю UILabel, содержащую галочку внутри нее. Этот способ реализации упрощает использование пользовательского представления в любом приложении без забот о любом зависимом ресурсе. Вы также можете легко настроить цвет галочки, закругленной рамки и фона. Здесь полный код:
#import <UIKit/UIKit.h>
@class CheckBoxView;
@protocol CheckBoxViewDelegate
- (void) checkBoxValueChanged:(CheckBoxView *) cview;
@end
@interface CheckBoxView : UIView {
    UILabel *checkMark;
    bool isOn;
    UIColor *color;
    NSObject<CheckBoxViewDelegate> *delegate;
}
@property(readonly) bool isOn;
@property(assign) NSObject<CheckBoxViewDelegate> *delegate;
- (void) drawRoundedRect:(CGRect) rect inContext:(CGContextRef) context;
@end
#import "CheckBoxView.h"
#define SIZE 30.0
#define STROKE_WIDTH 2.0
#define ALPHA .6
#define RADIUS 5.0
@implementation CheckBoxView
@synthesize isOn, delegate;
- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:CGRectMake(frame.origin.x, frame.origin.y, SIZE, SIZE)])) {
        // Initialization code
    }
    //UIColor *color = [UIColor blackColor];
    color = [[UIColor alloc] initWithWhite:.0 alpha:ALPHA];
    self.backgroundColor = [UIColor clearColor];
    checkMark = [[UILabel alloc] initWithFrame:CGRectMake(STROKE_WIDTH, STROKE_WIDTH, SIZE - 2 * STROKE_WIDTH, SIZE - 2*STROKE_WIDTH)];
    checkMark.font = [UIFont systemFontOfSize:25.];
    checkMark.text = @"\u2713";
    checkMark.backgroundColor = [UIColor clearColor];
    checkMark.textAlignment = UITextAlignmentCenter;
    //checkMark.textColor = [UIColor redColor];
    [self addSubview:checkMark];
    [checkMark setHidden:TRUE];
    isOn = FALSE;
    return self;
}
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
    CGRect _rect = CGRectMake(STROKE_WIDTH, STROKE_WIDTH, SIZE - 2 * STROKE_WIDTH, SIZE - 2*STROKE_WIDTH);
    [self drawRoundedRect:_rect inContext:UIGraphicsGetCurrentContext()];
    [checkMark setHidden:!isOn];
}
- (void)dealloc {
    [checkMark release];
    [color release];
    [super dealloc];
}
- (void) drawRoundedRect:(CGRect) rect inContext:(CGContextRef) context{
    CGContextBeginPath(context);
    CGContextSetLineWidth(context, STROKE_WIDTH);
    CGContextSetStrokeColorWithColor(context, [color CGColor]);
    CGContextMoveToPoint(context, CGRectGetMinX(rect) + RADIUS, CGRectGetMinY(rect));
    CGContextAddArc(context, CGRectGetMaxX(rect) - RADIUS, CGRectGetMinY(rect) + RADIUS, RADIUS, 3 * M_PI / 2, 0, 0);
    CGContextAddArc(context, CGRectGetMaxX(rect) - RADIUS, CGRectGetMaxY(rect) - RADIUS, RADIUS, 0, M_PI / 2, 0);
    CGContextAddArc(context, CGRectGetMinX(rect) + RADIUS, CGRectGetMaxY(rect) - RADIUS, RADIUS, M_PI / 2, M_PI, 0);
    CGContextAddArc(context, CGRectGetMinX(rect) + RADIUS, CGRectGetMinY(rect) + RADIUS, RADIUS, M_PI, 3 * M_PI / 2, 0);
    CGContextClosePath(context);
    CGContextStrokePath(context);
}
#pragma mark Touch
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint loc = [touch locationInView:self];
    if(CGRectContainsPoint(self.bounds, loc)){
        isOn = !isOn;
        //[self setNeedsDisplay];
        [checkMark setHidden:!isOn];
        if([delegate respondsToSelector:@selector(checkBoxValueChanged:)]){
            [delegate checkBoxValueChanged:self];
        }
    }
}
		Ответ 9
в .h файле
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
{
    BOOL isChecked;
    UIImageView * checkBoxIV;
}
@end
И файл .m
- (void)viewDidLoad
{
    [super viewDidLoad];
    isChecked = NO;
    //change this property according to your need
    checkBoxIV = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 15, 15)]; 
    checkBoxIV.image =[UIImage imageNamed:@"checkbox_unchecked.png"]; 
    checkBoxIV.userInteractionEnabled = YES;
    UITapGestureRecognizer *checkBoxIVTapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handlecheckBoxIVTapGestureTap:)];
    checkBoxIVTapGesture.numberOfTapsRequired = 1;
    [checkBoxIV addGestureRecognizer:checkBoxIVTapGesture];
}
- (void)handlecheckBoxIVTapGestureTap:(UITapGestureRecognizer *)recognizer {
    if (isChecked) {
        isChecked = NO;
        checkBoxIV.image =[UIImage imageNamed:@"checkbox_unchecked.png"];
    }else{
        isChecked = YES;
        checkBoxIV.image =[UIImage imageNamed:@"checkbox_checked.png"];   
    }
}
Это сделает трюк...
Ответ 10
Я сделал это с UITextField, чтобы не рисовать ничего странного, но мне нравилось вставлять текст в виде текста в виде юникода (символ Unicode CHECK MARK (U + 2713)) для NSString: @ "\ u2713".
Таким образом, в моем файле .h(реализация протокола UITextField 'UITextFieldDelegate'):
UITextField * myCheckBox;
В моем представленииDidLoad или функции для подготовки пользовательского интерфейса:
...
myCheckBox = [[UITextField alloc] initWithFrame:aFrame];
myCheckBox.borderStyle = UITextBorderStyleRoundedRect; // System look like
myCheckBox.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
myCheckBox.textAlignment = NSTextAlignmentLeft;
myCheckBox.delegate = self;
myCheckBox.text = @" -"; // Initial text of the checkbox... editable!
...
Затем добавьте селектор событий для reating в событии касания и вызовите событие responseSelected:
...
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(checkboxSelected)];
[myCheckBox addGestureRecognizer:tapGesture];
...
Наконец, ответьте на этот селектор
-(void) checkboxSelected
{
    if ([self isChecked])
    {
        // Uncheck the selection
        myCheckBox.text = @" -";
    }else{
       //Check the selection
       myCheckBox.text = @"\u2713";
    }
}
Функция 'isChecked' проверяет только, является ли текст отметкой @ "\ u2713". Чтобы предотвратить показ клавиатуры при выборе текстового поля, используйте событие UITextField 'textFieldShouldBeginEditing' и добавьте селектор событий для управления выбором:
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    // Question selected form the checkbox
    [self checkboxSelected];
    // Hide both keyboard and blinking cursor.
    return NO;
}
		Ответ 11
Подкласс UIButton, отпустите кнопку, чтобы просмотреть контроллер, выберите его и измените имя класса на CheckBox в инспекторе идентификации.
#import "CheckBox.h"
@implementation CheckBox
#define checked_icon @"checked_box_icon.png"
#define empty_icon @"empty_box_icon.png"
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self)
    {
        [self setImage:[UIImage imageNamed:empty_icon] forState:UIControlStateNormal];
        [self addTarget:self action:@selector(didTouchButton) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}
- (void)didTouchButton {
    selected = !selected;
    if (selected)
        [self setImage:[UIImage imageNamed:checked_icon] forState:UIControlStateNormal];
    else
        [self setImage:[UIImage imageNamed:empty_icon] forState:UIControlStateNormal];
}
@end
		Ответ 12
пользователь Aruna Lakmal; FYI, когда вы добавляете этот код в IB, поскольку вы описываете, что initWithFrame не вызывается, initWithCoder. Внедрите initWithCoder, и он будет работать по вашему описанию.
Ответ 13
Я сделал один недавно. Бесплатное приобретение от GitHub. Посмотрим, поможет ли это. Эффект как
