Checkbox in iOS-Anwendung

stimmen
34

Ich muss Checkbox Kontrollen meiner Form hinzufügen. Ich weiß, dass es in iOS SDK keine solche Kontrolle ist. Wie könnte ich das tun?

Veröffentlicht am 16/03/2009 um 13:05
quelle vom benutzer
In anderen Sprachen...                            


13 antworten

stimmen
31

dies wurde treibt mich zu verrückt und ich fand eine andere Lösung, die funktioniert gut für mich und vermeidet die Verwendung von Bildern mit.

  1. Fügen Sie ein neues Label-Objekt zu Interface Builder.
  2. Erstellen Sie eine IBOutlet Eigenschaft in Xcode und schließen Sie es an ihn. Im folgenden Code ich es genannt habe ‚fullyPaid‘, wie ich voll, wenn jemand wissen will, eine Geldsumme gezahlt hat.
  3. Fügen Sie die 2 Funktionen unten. Die Funktion überprüft ‚touchesBegan‘, wenn Sie berührt irgendwo in der Label-Objekt ‚fullyPaid‘ und wenn ja, es ruft die ‚togglePaidStatus‘ Funktion. Die ‚togglePaidStatus‘ Funktion einrichtet zwei Zeichenketten, welche die Unicode-Zeichen haben eine leere Box (\ u2610) und ein markiertes Kästchen repräsentieren (\ u2611) sind. Dann vergleicht es ist, was zur Zeit in dem ‚fullyPaid‘ Objekt und schaltet sie mit dem anderen String.

Vielleicht möchten Sie die togglePaidStatus Funktion in der viewDidLoad Funktion aufzurufen es auf eine leere Zeichenfolge zunächst einzustellen.

Natürlich können Sie zusätzliche Kontrollen in dem Benutzer zu verhindern, dass das Kontrollkästchen Makel, wenn das Etikett nicht aktiviert ist, aber das ist nicht weiter unten.

-(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];
}
Beantwortet am 10/04/2010 um 22:23
quelle vom benutzer

stimmen
26

Im Allgemeinen würden Sie die UISwitch für Checkbox-ähnliche Funktionalität verwenden.

Sie könnten Ihre eigene Rolle, obwohl durch eine Bildsteuerung mit zwei Bildern unter Verwendung (aktiviert / deaktiviert) und das Umschalten der Bilder, wenn sie die Kontrolle berühren /

Beantwortet am 16/03/2009 um 13:12
quelle vom benutzer

stimmen
10

Wenn Sie eine Gruppe von Optionen sind zeigt, und der Benutzer kann eine von ihnen wählen, eine Tableview mit einem Häkchen Zubehör verwenden und eine andere Textfarbe auf der ausgewählten Zeile.

Wenn Sie eine einzelne Option haben, Ihre beste Wette ist, einen Schalter zu verwenden. Wenn Sie nicht können oder wollen nicht, eine Taste verwenden, das normale Bild auf eine leere Box und das ausgewählte Bild auf einem karierten Feld zu setzen. Sie werden jene zwei Bilder, um sich oder Lager Grafiken machen müssen, um für sie zu bedienen.

Beantwortet am 16/03/2009 um 13:33
quelle vom benutzer

stimmen
8

Die Ausweitung auf Adrean Idee , habe ich dies mit einem sehr einfachen Ansatz erreicht.
Meine Idee ist , Taste ändern (können sagen checkBtn) Text in Abhängigkeit von seinem Zustand, und dann auf die Schaltfläche des Staates in seiner ändern IBAction.
Unten ist der Code , wie ich dies tat:

- (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's selected state  

    if (sender.state == UIControlStateSelected) {    
        // do something when button is checked 
    } else {
        // do something when button is unchecked
    }
}
Beantwortet am 19/03/2014 um 05:17
quelle vom benutzer

stimmen
6

Hier ist meine Version von Kontrollkästchen für iphone.

Es ist einzige Klasse, die UIButton erstreckt. Es ist einfach, so dass ich hier einfügen wird.

CheckBoxButton.h Dateiinhalt

#import <UIKit/UIKit.h>

@interface CheckBoxButton : UIButton

@property(nonatomic,assign)IBInspectable BOOL isChecked;

@end

CheckBoxButton.m Dateiinhalt

#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

Sie können Bilder für aktiviert / deaktiviert sowie isChecked Eigenschaft im Attribut-Inspektoren von Visual Studio festgelegt.

Geben Sie hier image description

CheckBoxButton in Storyboard oder xib, einfachem Add UIButton und setzen individuelle Klasse wie auf zum nächsten Bild hinzuzufügen.

Geben Sie hier image description

Button wird UIControlEventValueChanged Ereignis senden, jedes Mal, wenn isChecked Zustand geändert wird.

Beantwortet am 31/12/2014 um 13:44
quelle vom benutzer

stimmen
6

Ich wollte dies programmatisch tun, und lösen auch das Problem, dass der Hit-Bereich wirklich zu klein war. Dies wird aus verschiedenen Quellen angepasst, darunter Mike und Mike Kommentator Agha.

In der Kopfzeile

@interface YourViewController : UIViewController {
    BOOL checkboxSelected;
    UIButton *checkboxButton;
}

@property BOOL checkboxSelected;;
@property (nonatomic, retain) UIButton *checkboxButton;

-(void)toggleButton:(id)sender;

Und in Ihrer Implementierung

// 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's 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];

Und setzt diese Methode auch:

- (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];

}
Beantwortet am 21/05/2010 um 17:46
quelle vom benutzer

stimmen
4

Everyones Code hier ist sehr lang, etwas chaotisch, und könnte viel einfacher durchgeführt werden. Ich habe ein Projekt auf GitHub, die UIControl Unterklasse, die Sie herunterladen können und Check-out und geben Ihnen ein nahezu nativer Kontrollkästchen UI-Element:

https://github.com/Brayden/UICheckbox

Beantwortet am 18/07/2012 um 08:03
quelle vom benutzer

stimmen
1

Subclass UIButton, fallen auf einen Knopf-Controller anzuzeigen, wählen Sie es und Klassenname in der Identität Inspektor CheckBox zu ändern.

#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
Beantwortet am 13/05/2015 um 11:59
quelle vom benutzer

stimmen
1

Ich habe es mit einem UITextField seltsamem Zeichnung, alles zu vermeiden, aber ich mochte innen als Text der Zecke Unicode (Unicode Zeichen ‚karokennzeichen‘ (U + 2713)) für den NSString setzen: @ „\ u2713“.

Auf diese Weise in meinem .h-Datei (das Protokoll für die ‚UITextFieldDelegate‘ UITextField Umsetzung):

UITextField * myCheckBox;

In meinem viewDidLoad oder die Funktion der Benutzeroberfläche vorzubereiten:

...
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!
...

Dann fügen Sie im Touch-Ereignis ein Ereignis Selektor für rstelleneineskomplett und ‚responseSelected‘ Ereignis aufrufen:

...
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(checkboxSelected)];
[myCheckBox addGestureRecognizer:tapGesture];
...

reagieren schließlich zu diesem Selektor

-(void) checkboxSelected
{
    if ([self isChecked])
    {
        // Uncheck the selection
        myCheckBox.text = @" -";
    }else{
       //Check the selection
       myCheckBox.text = @"\u2713";
    }
}

Die Funktion ‚isChecked‘ nur überprüft, ob der Text der @ „\ u2713“ Häkchen ist. Um zu verhindern, die Tastatur zeigt, wenn das Textfeld das Ereignis des ‚textFieldShouldBeginEditing‘ UITextField verwenden ausgewählt ist, und fügen Sie den Event-Selektor die Auswahl zu verwalten:

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
    // Question selected form the checkbox
    [self checkboxSelected];

    // Hide both keyboard and blinking cursor.
    return NO;
}
Beantwortet am 07/10/2014 um 12:13
quelle vom benutzer

stimmen
1

in h-Datei

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    BOOL isChecked;
    UIImageView * checkBoxIV;
}
@end

Und .m-Datei

- (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"];   
    }
}

Dies wird den Trick ...

Beantwortet am 14/06/2013 um 11:12
quelle vom benutzer

stimmen
1

Ich mag die Idee von Adrian die Zeichen zu verwenden, anstatt Bildern. Aber Ich mag nicht den Kasten, es muss nur das Häkchen selbst (@ „\ u2713“). Ich ziehe einen Kasten (eine abgerundete box) programmatisch und platzieren ein UILabel den Haken im Innern enthält. Diese Art der Implementierung macht es einfach, die benutzerdefinierte Ansicht in jeder Anwendung ohne Sorge um jede abhängige Ressource zu verwenden. Sie können auch die Farbe des Häkchen, die abgerundete Kasten und den Hintergrund mit Leichtigkeit anpassen. Hier ist der vollständige Code:

#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];
        }
    }
}
Beantwortet am 23/07/2010 um 10:41
quelle vom benutzer

stimmen
0

Ich habe ein vor kurzem. Frei von GitHub zu erwerben. Sehen Sie, wenn diese helfen. Der Effekt ist wie

Geben Sie hier image description

Beantwortet am 01/04/2019 um 20:36
quelle vom benutzer

stimmen
0

Benutzer Aruna Lakmal; FYI, wenn Sie diesen Code IB hinzufügen, wie Sie beschreiben Initwithframe wird nicht genannt, ist initWithCoder. Implementieren Sie initWithCoder und es wird funktionieren, wie Sie beschreiben.

Beantwortet am 20/01/2013 um 04:15
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more