În caseta de selectare aplicațiilor iOS

voturi
34

Trebuie să adăugați controale din casetele de selectare pentru a forma mea. Știu că nu există nici un astfel de control în iOS SDK. Cum aș putea să fac asta?

Întrebat 16/03/2009 la 13:05
sursa de către utilizator
În alte limbi...                            


13 răspunsuri

voturi
31

acest lucru a fost de conducere mine nebun prea și am găsit o soluție diferită, care funcționează bine pentru mine si evita sa utilizeze imagini.

  1. Adăugați un nou obiect etichetă Interface Builder.
  2. Creați o proprietate IBOutlet în Xcode și conectați-l la ea. În codul de mai jos l-am numit „fullyPaid“ așa cum vreau să știu dacă cineva a plătit integral o sumă de bani.
  3. Adăugați cele 2 funcții de mai jos. verificări funcția „touchesBegan“ dacă ai atins undeva în interiorul obiectului eticheta „fullyPaid“ și în caz afirmativ, se numește funcția „togglePaidStatus“. Funcția „togglePaidStatus“ stabilește două șiruri care au caractere unicode.Versiunile reprezentând o cutie goală (\ u2610) și o cutie de verificat (\ u2611), respectiv. Apoi compară ceea ce este în prezent în obiect „fullyPaid“ și-l cu comutã alt șir.

S-ar putea dori să apela funcția togglePaidStatus în funcția viewDidLoad pentru a seta la un șir gol inițial.

Evident, puteți adăuga controale suplimentare pentru a împiedica utilizatorii comutând caseta de selectare dacă eticheta nu este activat, dar care nu este afișată mai jos.

-(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];
}
Publicat 10/04/2010 la 22:23
sursa de către utilizator

voturi
26

În general, trebuie să utilizați UISwitch pentru a funcționa-checkbox cum ar fi.

Ai putea rula propriul deși prin utilizarea unui control de imagine cu două imagini (verificate / neverificată) și comutarea imaginilor atunci când acestea ating controlul /

Publicat 16/03/2009 la 13:12
sursa de către utilizator

voturi
10

Dacă afișați un grup de opțiuni, iar utilizatorul poate selecta una dintre ele, folosiți un tableview cu un accesoriu bifă și o culoare de text diferit pe rândul selectat.

Dacă aveți o singură opțiune, cel mai bun pariu este de a utiliza un comutator. Dacă nu se poate sau nu doriți să folosiți un buton, setarea imaginii normale într-o cutie goală, iar imaginea selectată într-o casetă bifată. Va trebui să facă aceste două imagini sau le găsiți grafice de stoc pentru a utiliza pentru ei.

Publicat 16/03/2009 la 13:33
sursa de către utilizator

voturi
8

Extinderea la ideea Adrean lui , am realizat acest lucru , folosind o abordare foarte simplă.
Ideea mea este buton pentru a schimba (vă permite să spun checkBtn) textul în funcție de starea sa, si apoi schimba starea butonul din ei IBAction.
Mai jos este codul cum am făcut acest lucru:

- (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
    }
}
Publicat 19/03/2014 la 05:17
sursa de către utilizator

voturi
6

Aici este versiunea mea de casetă de selectare pentru iPhone.

Este singura clasa care se extinde UIButton. Este simplu, astfel i se va paste aici.

conținutului fișierului CheckBoxButton.h

#import <UIKit/UIKit.h>

@interface CheckBoxButton : UIButton

@property(nonatomic,assign)IBInspectable BOOL isChecked;

@end

conținutului fișierului 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

Puteți seta imagini pentru a verifica proprietatea / neverificată precum și isChecked în inspectorul atribut al Visual Studio.

introduceți descrierea imaginii aici

Pentru a adăuga CheckBoxButton în storyboard sau XIb, simplu adăugare în UIButton și setați clasa personalizate ca și pe următoarea imagine.

introduceți descrierea imaginii aici

Butonul va trimite eveniment UIControlEventValueChanged, de fiecare dată când starea isChecked este schimbat.

Publicat 31/12/2014 la 13:44
sursa de către utilizator

voturi
6

Am vrut să fac acest lucru în mod programatic, și, de asemenea, rezolva problema că zona a lovit a fost într-adevăr prea mic. Acest lucru este adaptat din diferite surse, inclusiv Mike și lui Mike commenter Agha.

În antetul

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

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

-(void)toggleButton:(id)sender;

Și în implementarea

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

Și a pus această metodă în prea:

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

}
Publicat 21/05/2010 la 17:46
sursa de către utilizator

voturi
4

Codul Everyones aici este foarte lung, ușor dezordonat, și ar putea fi realizat mult mai simplu. Am un proiect pe GitHub acea subclasa UIControl pe care le puteți descărca și a verifica afară și vă oferă un element casetă de selectare UI aproape nativ:

https://github.com/Brayden/UICheckbox

Publicat 18/07/2012 la 08:03
sursa de către utilizator

voturi
1

Subclasa UIButton, picătură un buton pentru a vizualiza controler, selectați-l și schimba numele clasei la CheckBox în inspectorul de identitate.

#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
Publicat 13/05/2015 la 11:59
sursa de către utilizator

voturi
1

Am făcut-o cu un UITextField pentru a evita orice desen ciudat, dar mi-a plăcut punerea în interiorul ca textul unicode capusa (caractere Unicode „bifă“ (U + 2713)) pentru NSString: @ „\ u2713“.

În acest fel, în dosarul meu .h (punerea în aplicare a protocolului pentru „UITextFieldDelegate denumită în continuare“ UITextField):

UITextField * myCheckBox;

În viewDidLoad mea sau funcția de a pregăti UI:

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

Apoi, se adaugă un selector eveniment pentru rearea în caz de asteptare atingere și eveniment „responseSelected“:

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

În cele din urmă răspunde la acest selector

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

Funcția „isChecked“ doar verifică dacă textul este @ „\ u2713“ marcaj de selectare. Pentru a preveni afișarea tastaturii atunci când câmpul de text este selectat utiliza evenimentul de „textFieldShouldBeginEditing denumită în continuare“ UITextField și adăugați selectorul de evenimente pentru a gestiona selecția:

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

    // Hide both keyboard and blinking cursor.
    return NO;
}
Publicat 07/10/2014 la 12:13
sursa de către utilizator

voturi
1

în fișierul .h

#import <UIKit/UIKit.h>

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

Și fișier .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"];   
    }
}

Acest lucru va face truc ...

Publicat 14/06/2013 la 11:12
sursa de către utilizator

voturi
1

Îmi place ideea de a folosi Adrian personajele, mai degrabă decât imaginile. Dar nu-mi place caseta, este nevoie de doar bifă în sine (@ „\ u2713“). Desenez o cutie (o cutie rotunjită) și programatic loc un UILabel conține checkmark în interiorul acestuia. Acest mod de implementare îl face ușor de utilizat vizualizarea personalizată în orice aplicație, fără grijă despre orice resursă dependente. Puteți personaliza, de asemenea, culoarea bifă, cutia rotunjită și fundal cu ușurință. Iată codul complet:

#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];
        }
    }
}
Publicat 23/07/2010 la 10:41
sursa de către utilizator

voturi
0

Am făcut unul recent. Liber să achiziționeze de la GitHub. A se vedea , în cazul în care acest lucru va ajuta. Efectul este ca

introduceți descrierea imaginii aici

Publicat 01/04/2019 la 20:36
sursa de către utilizator

voturi
0

utilizator Aruna Lakmal; FYI, atunci când adăugați acest cod la IB după cum ați descrie initWithFrame nu este numit, este initWithCoder. Punerea în aplicare a initWithCoder si va lucra ca ați descrie.

Publicat 20/01/2013 la 04:15
sursa de către utilizator

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