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?
În caseta de selectare aplicațiilor iOS
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.
- Adăugați un nou obiect etichetă Interface Builder.
- 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.
- 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];
}
Î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 /
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.
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
}
}
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.

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.

Butonul va trimite eveniment UIControlEventValueChanged, de fiecare dată când starea isChecked este schimbat.
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];
}
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:
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
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;
}
î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 ...
Î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];
}
}
}
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
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.














