Azt hozzá kell négyzetet ellenőrzések formámat. Tudom, hogy nincs olyan szabályozás iOS SDK. Hogyan tudom ezt megtenni?
Jelölőnégyzetet iOS alkalmazás
ez már vezetés megőrülök is, és találtam egy másik megoldás, hogy jól működik nekem, és elkerüli, hogy használja a képeket.
- Új címke tárgy Interface Builder.
- Hozzon létre egy IBOutlet ingatlan Xcode és csatlakoztassa hozzá. Az alábbi kódot hívtam ez fullyPaid ", mint azt szeretném tudni, ha valaki teljesen befizetett pénzösszeg.
- Adjuk hozzá a 2 alábbi funkciók. A „touchesBegan” funkció ellenőrzi, ha megérinti valahol a „fullyPaid” címke tárgy, és ha igen, akkor meghívja a „togglePaidStatus” funkciót. A „togglePaidStatus” funkció beállítja két húrok, amelyeknek az unicode karaktereket ábrázoló egy üres doboz (\ u2610) és egy kockás doboz (\ u2611) volt. Ezután le, hogy pillanatnyilag mi a „fullyPaid” objektumot, és átváltja azt a többi húr.
Érdemes felhívni a togglePaidStatus funkciót a viewDidLoad funkció úgy beállítani, hogy egy üres karakterlánc elején.
Nyilván akkor extra ellenőrzéseket, hogy megakadályozzák a felhasználók váltva a négyzetet, ha a címke nem engedélyezett, de ezt nem mutatjuk.
-(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];
}
Általában akkor használja a UISwitch a négyzetet-szerű funkcionalitást.
Lehet dobni saját bár használatával képvezérlés két kép (ellenőrzött / bejelölve), és bekapcsolja a képeket, amikor megérintik a szabályozó /
Ha mutató csoport lehetőséget, és a felhasználó választhat közülük használjon Tableview pipával tartozék és más színnel a kiválasztott sor.
Ha van egy lehetőség, a legjobb megoldás az, hogy egy kapcsolót. Ha nem tud, vagy nem akar, használja a gombot, amelyben a normál kép egy üres dobozt, és a kiválasztott kép egy ellenőrzött dobozban. Itt van, hogy a két kép, vagy inkább keres készlet grafikus használni őket.
Kiterjesztve Adrean ötlete , én már elérte ezt egy nagyon egyszerű megközelítés.
Az én elképzelésem az, hogy változtatni gomb (mondjuk checkBtn) a szöveg függően az állami, majd változtassa meg a gombot az állapotának a IBAction.
Az alábbiakban a kódot hogyan tettem ezt:
- (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
}
}
Itt van az én verzióm jelölőnégyzetet iphone.
Ez egy osztály, amely kiterjed UIButton. Ez egyszerű, így én is másolja be ide.
CheckBoxButton.h fájl tartalma
#import <UIKit/UIKit.h>
@interface CheckBoxButton : UIButton
@property(nonatomic,assign)IBInspectable BOOL isChecked;
@end
CheckBoxButton.m fájl tartalma
#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
Beállíthatjuk képeket ellenőrzött / ellenőrzött valamint isChecked tulajdonság az attribútum ellenőr a Visual Studio.

Hozzáadni CheckBoxButton a storyboard vagy XIb egyszerű add UIButton és be egyéni osztály, mint a következő képet.

Gomb küld UIControlEventValueChanged esemény, minden alkalommal, amikor isChecked állapota megváltozik.
Azt akartam, hogy ezt programozottan, valamint oldja meg a problémát, hogy az érintett terület tényleg túl kicsi. Ez úgy van kialakítva, különböző forrásokból, köztük Mike és Mike commenter Agha.
A fejléc
@interface YourViewController : UIViewController {
BOOL checkboxSelected;
UIButton *checkboxButton;
}
@property BOOL checkboxSelected;;
@property (nonatomic, retain) UIButton *checkboxButton;
-(void)toggleButton:(id)sender;
És az implementáció
// 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];
És hogy ezt a módszert is:
- (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];
}
Mindenkit kódot itt nagyon hosszú, kissé rendetlen, és lehetne tenni egy sokkal egyszerűbb. Van egy projekt GitHub hogy alosztályba UIControl, hogy lehet letölteni, és nézd meg, és ad egy majdnem eredeti négyzetet UI elem:
Alosztály UIButton, csepp egy gombot a vezérlő, jelölje ki, és változtatni osztály nevét jelölőnégyzetet az identitás ellenő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
Megcsináltam egy UITextField hogy elkerülje semmi különös, de szerettem üzembe belül szövegként a kullancs unicode (Unicode karakter „pipa” (U + 2713)) a NSString: @ „\ u2713”.
Így, az én .h fájlt (a jegyzőkönyv végrehajtására a UITextField "UITextFieldDelegate):
UITextField * myCheckBox;
Az én viewDidLoad vagy funkciója, hogy előkészítse a 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!
...
Ezután adjunk hozzá egy eseményt választó az reating az érintési esemény és a hívó „responseSelected” esemény:
...
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(checkboxSelected)];
[myCheckBox addGestureRecognizer:tapGesture];
...
Végül válaszolni, hogy a választó
-(void) checkboxSelected
{
if ([self isChecked])
{
// Uncheck the selection
myCheckBox.text = @" -";
}else{
//Check the selection
myCheckBox.text = @"\u2713";
}
}
Az „isChecked” csak ellenőrzi, hogy a szöveg a @ „\ u2713” pipa. Annak megakadályozása érdekében, amely bemutatja a billentyűzet, ha a szöveg van kijelölve használja az esetben, ha a UITextField „textFieldShouldBeginEditing”, és adjuk hozzá a rendezvény választó kezelni a választás:
-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
// Question selected form the checkbox
[self checkboxSelected];
// Hide both keyboard and blinking cursor.
return NO;
}
a .h fájlban
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
{
BOOL isChecked;
UIImageView * checkBoxIV;
}
@end
És .m fájlban
- (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"];
}
}
Ez a trükk ...
Tetszik az ötlet, Adrian, hogy használja a karakterek helyett képeket. De én nem szeretem a dobozt, akkor kell csak a pipa is (@ „\ u2713”). Rajzolok egy doboz (lekerekített doboz) programozott és tegyen egy UILabel tartalmazza a pipa benne. Így a végrehajtás megkönnyíti használja az egyéni nézetet bármely alkalmazás gond nélkül bármilyen függő erőforrás. Azt is testre a színe a pipa, a lekerekített dobozt és a háttér könnyedén. Íme a teljes kód:
#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];
}
}
}
Csináltam egy közelmúltban. Szabad megszerzi GitHub. Hátha ez segít. A hatás olyan, mint
felhasználói Aruna Lakmal; FYI, ha hozzá ezt a kódot, hogy az IB, ahogy leírja initWithFrame nem nevezett, initWithCoder van. Végre initWithCoder és működni fog, ahogy leírja.














