Jeg må legge til avmerkingsboksen kontrollene til min form. Jeg vet at det ikke er slik kontroll i iOS SDK. Hvordan kan jeg gjøre dette?
Avmerkingsboks i iOS søknad
dette har vært driver meg gal også, og jeg har funnet en annen løsning som fungerer godt for meg og unngår å måtte bruke bilder.
- Legg til en ny etikett objekt til Interface Builder.
- Opprett en IBOutlet eiendom i Xcode og koble den opp til det. I koden under Jeg har kalt det fullyPaid "som jeg ønsker å vite om noen har fullt betalt en sum penger.
- Tilsett 2 funksjoner nedenfor. The 'touchesBegan' funksjons sjekker om du trykket et sted inne i 'fullyPaid' label objekt og hvis så, det kaller den 'togglePaidStatus' -funksjonen. Den 'togglePaidStatus-funksjonen setter opp to strenger som har de unicode tegn som representerer en tom boks (\ u2610) og der det er merket (\ u2611) hhv. Deretter sammenlignes hva som er for tiden i 'fullyPaid' objekt og slår den med den andre strengen.
Du vil kanskje kalle togglePaidStatus funksjon i viewDidLoad funksjon for å sette den til en tom streng i utgangspunktet.
Selvsagt kan du legge til ekstra kontroller for å hindre brukere vippedrift av i boksen hvis etiketten ikke er aktivert, men det er ikke vist nedenfor.
-(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];
}
Vanligvis vil du bruke UISwitch for boksen-lignende funksjonalitet.
Du kan rulle din egen selv ved hjelp av en bildekontroll med to bilder (sjekket / ukontrollert) og bytte bildene når de berører kontroll /
Hvis du viser en gruppe med alternativer, og brukeren kan velge en av dem, kan du bruke en tabellvisning med en hake tilbehør og en annen tekstfarge på den valgte raden.
Hvis du har en enkelt alternativ, er det beste alternativet å bruke en bryter. Hvis du ikke kan eller ikke ønsker å bruke en knapp, sette det vanlige bildet til en tom boks og det valgte bildet til en kontrollert boks. Du må gjøre disse to bildene selv eller finne lager grafikk til bruk for dem.
Strekker seg til Adrean idé , jeg har oppnådd dette ved hjelp av en veldig enkel tilnærming.
Min idé er å endre knappen (la oss si checkBtn) tekst avhengig av sin tilstand, og deretter endre knappens staten i sin IBAction.
Nedenfor er koden hvordan jeg gjorde dette:
- (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
}
}
Her er min versjon av boksen for iphone.
Det er enkelt klasse, som strekker seg UIButton. Det er enkelt, så jeg vil lime det her.
CheckBoxButton.h filinnhold
#import <UIKit/UIKit.h>
@interface CheckBoxButton : UIButton
@property(nonatomic,assign)IBInspectable BOOL isChecked;
@end
CheckBoxButton.m filinnhold
#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
Du kan sette bilder til sjekket / ukontrollert samt isChecked eiendom i egenskap inspektør for Visual Studio.

For å legge til CheckBoxButton i storyboard eller xib, enkel add UIButton og sette egendefinert klasse som på neste bilde.

Knappen vil sende UIControlEventValueChanged hendelse, hver gang når isChecked tilstand endres.
Jeg ønsket å gjøre dette programmatisk, og også løse problemet at treffet området var virkelig for liten. Denne er tilpasset fra ulike kilder, inkludert Mike og Mike bemerket Agha.
I overskriften
@interface YourViewController : UIViewController {
BOOL checkboxSelected;
UIButton *checkboxButton;
}
@property BOOL checkboxSelected;;
@property (nonatomic, retain) UIButton *checkboxButton;
-(void)toggleButton:(id)sender;
Og i implementeringen
// 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];
Og sette denne metoden også:
- (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];
}
Everyones kode her er veldig lang, litt rotete, og kunne gjøres mye enklere. Jeg har et prosjekt på GitHub at underklasse UIControl som du kan laste ned og sjekke ut og gir deg en nesten innfødte boksen UI element:
Underklasse UIButton, slippe en knapp for å vise kontrolleren, velg den og endre klasse navn til avmerkingsbokser i identitets inspektør.
#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
Jeg gjorde det med en UITextField å unngå å trekke noe merkelig, men jeg likte å sette inne som tekst flåtten Unicode (Unicode Character 'hake' (U + 2713)) for NSString: @ "\ u2713".
På denne måten, i min .h fil (gjennomføring av protokollen for UITextField 'UITextFieldDelegate'):
UITextField * myCheckBox;
I min viewDidLoad eller funksjonen for å forberede 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!
...
Deretter legge til en hendelse velgeren for reating i berørings hendelsen og kaller 'responseSelected' event:
...
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(checkboxSelected)];
[myCheckBox addGestureRecognizer:tapGesture];
...
Endelig svare på at velgeren
-(void) checkboxSelected
{
if ([self isChecked])
{
// Uncheck the selection
myCheckBox.text = @" -";
}else{
//Check the selection
myCheckBox.text = @"\u2713";
}
}
Funksjonen 'isChecked' bare kontrollerer om teksten er @ "\ u2713" hake. For å hindre viser tastaturet når tekstfeltet er valgt å bruke en eventuell UITextField 'textFieldShouldBeginEditing' og legge til hendelsen velgeren til å styre valg:
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
// Question selected form the checkbox
[self checkboxSelected];
// Hide both keyboard and blinking cursor.
return NO;
}
i .h fil
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
{
BOOL isChecked;
UIImageView * checkBoxIV;
}
@end
Og .m fil
- (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"];
}
}
Dette vil gjøre susen ...
Jeg liker ideen om Adrian å bruke tegn i stedet for bilder. Men jeg liker ikke boksen, det trenger bare haken selv (@ "\ u2713"). I tegne en boks (en avrundet boks) programmatisk og plassere en UILabel inneholder hake i den. Denne måten å gjennomføre gjør det enkelt å bruke den tilpassede visningen i alle programmer uten å bry seg om noen avhengige ressurs. Du kan også tilpasse fargen på haken, den avrundede boksen og bakgrunnen med letthet. Her er den komplette koden:
#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];
}
}
}
Jeg gjorde en nylig. Gratis å kjøpe fra GitHub. Se om dette vil hjelpe. Effekten er som
Brukeren Aruna Lakmal; Til info, når du legger denne koden for å IB som du beskriver initWithFrame ikke kalles, er initWithCoder. Implementere initWithCoder og den vil fungere som du beskriver.














