Políčko v aplikaci pro iOS

hlasů
34

Musím se přidat ovládací prvky políčka mé podoby. Vím, že není tam žádná taková kontrola v iOS SDK. Jak bych mohl udělat?

Položena 16/03/2009 v 13:05
zdroj uživatelem
V jiných jazycích...                            


13 odpovědí

hlasů
31

toto bylo přivádí mě k šílenství a taky jsem našel jiné řešení, které funguje dobře pro mě a vyhne nutnosti používat obrázky.

  1. Přidat nový objekt štítku Interface Builder.
  2. Vytvořit vlastnost IBOutlet v Xcode a připojte se k ní. V kódu níže jsem nazval ‚fullyPaid‘, jak já chci vědět, jestli někdo má plně zaplatil sumu peněz.
  3. Přidejte níže uvedené 2 funkce. Dále jen ‚touchesBegan‘ funkce kontroluje, zda jste se dotkl někde uvnitř objektu štítku ‚fullyPaid‘, a pokud ano, zavolá funkci ‚togglePaidStatus‘. Funkce ‚togglePaidStatus‘ nastavuje dva řetězce, které mají Unicode znaky reprezentující prázdnou krabici (\ u2610) a zkontrolovat políčko (\ u2611) v tomto pořadí. Pak porovnává, co je v současné době v ‚fullyPaid‘ objekt a přepíná jej s jiným řetězcem.

Možná budete chtít, aby volání funkce togglePaidStatus ve funkci viewDidLoad ji nastavit na prázdný řetězec zpočátku.

Je zřejmé, můžete přidat další kontroly, aby zabránily uživatelům přepínání políčko v případě, že návěští není povoleno, ale to není uvedeno níže.

-(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];
}
Odpovězeno 10/04/2010 v 22:23
zdroj uživatelem

hlasů
26

Obecně platí, že byste použít UISwitch pro checkbox-jako funkčnost.

Ty by mohly vytvořit vlastní když pomocí ovládací prvek obrázek se dvěma obrazy (kontrolovány / nezaškrtnuté) a přepnutí obrazu, když se dotknou kontrolu /

Odpovězeno 16/03/2009 v 13:12
zdroj uživatelem

hlasů
10

Pokud zobrazující skupinu voleb a uživatel si může vybrat jednu z nich, použijte Tableview s zaškrtnutí příslušenstvím a jinou barvu textu na vybraný řádek.

Jestliže máte jedinou možnost, je nejlepší používat přepínače. Pokud nemůžete nebo nechcete, použijte tlačítko, kterým se normální obraz na prázdné pole a vybraný obrázek se kontrolované krabice. Budete muset provést tyto dva obrazy sami, nebo najít obrázky grafiky používat pro ně.

Odpovězeno 16/03/2009 v 13:33
zdroj uživatelem

hlasů
8

Rozšiřuje Adrean nápadu , jsem toho dosáhl pomocí velmi jednoduchý přístup.
Moje představa je, tlačítko pro změnu (řekněme checkBtn) textu v závislosti na jeho stavu, a pak změnit stav tlačítko v jeho IBAction.
Níže je uveden kód, jak jsem to udělal:

- (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
    }
}
Odpovězeno 19/03/2014 v 05:17
zdroj uživatelem

hlasů
6

Tady je moje verze políčko pro iPhone.

Je to jediné třídy, která se rozprostírá UIButton. Je to jednoduché, tak jsem jej vložit sem.

Obsah souboru CheckBoxButton.h

#import <UIKit/UIKit.h>

@interface CheckBoxButton : UIButton

@property(nonatomic,assign)IBInspectable BOOL isChecked;

@end

Obsah souboru 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

Obrázky můžete nastavit pro zapsaná / nekontrolované stejně jako isChecked majetku v atributu inspektor Visual Studio.

zadejte popis obrázku zde

Chcete-li přidat CheckBoxButton ve scénáři nebo na XIb, jednoduchý doplněk UIButton a nastavit vlastní třídu jako na dalším obrázku.

zadejte popis obrázku zde

Tlačítko pošle UIControlEventValueChanged události, pokaždé, když se isChecked stav změnit.

Odpovězeno 31/12/2014 v 13:44
zdroj uživatelem

hlasů
6

Chtěl jsem to udělat programově, a také vyřešit problém, že hit oblast byla opravdu příliš malá. To je převzato z různých zdrojů, včetně Mike a Mikova komentátor Agha.

V záhlaví

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

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

-(void)toggleButton:(id)sender;

A implementaci

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

A dát tuto metodu příliš:

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

}
Odpovězeno 21/05/2010 v 17:46
zdroj uživatelem

hlasů
4

Everyones kód je zde velmi dlouhá, mírně chaotický, a může být provedeno mnohem jednodušší. Mám projekt na GitHub, že podtřídy UIControl, které si můžete stáhnout a vyzkoušet a poskytuje téměř nativní políčko prvek uživatelského rozhraní:

https://github.com/Brayden/UICheckbox

Odpovězeno 18/07/2012 v 08:03
zdroj uživatelem

hlasů
1

Subclass UIButton, pokles tlačítko pro zobrazení ovladače, vyberte jej a změnit název třídy CheckBox v totožnosti inspektora.

#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
Odpovězeno 13/05/2015 v 11:59
zdroj uživatelem

hlasů
1

Udělal jsem to s UITextField, aby se zabránilo čerpání nic divného ale líbilo se mi dávat dovnitř jako text klíštěte Unicode (Unicode znak ‚zatržítko‘ (U + 2713)) pro NSString: @ „\ u2713“.

Tímto způsobem je podle mého h souboru (prováděcí protokol pro UITextField ‚UITextFieldDelegate‘):

UITextField * myCheckBox;

Podle mého viewDidLoad nebo funkci pro přípravu 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!
...

Poté přidejte voličem událostí pro reating na dotykovém události a voláním ‚responseSelected‘ událost:

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

Konečně reagovat na tuto selektoru

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

Funkce ‚isChecked‘ pouze zkontroluje, zda je text ' „\ u2713“ háčkem. Chcete-li zabránit zobrazování klávesnice, když je vybrána v textovém poli pomocí události UITextField ‚textFieldShouldBeginEditing‘ a přidejte volič události řídit výběr:

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

    // Hide both keyboard and blinking cursor.
    return NO;
}
Odpovězeno 07/10/2014 v 12:13
zdroj uživatelem

hlasů
1

V h souboru

#import <UIKit/UIKit.h>

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

A .m souborů

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

To bude stačit ...

Odpovězeno 14/06/2013 v 11:12
zdroj uživatelem

hlasů
1

Líbí se mi myšlenka Adrian použít znaky, spíše než obrazy. Ale nemám rád krabici, stačí jen samotná značka (@ „\ u2713“). I nakreslit rámeček (kulatý box) programově a umístěte UILabel obsahuje zatržítko uvnitř ní. Tento způsob implementace usnadňuje použití vlastního zobrazení v jakékoliv aplikaci bez péče o všechny závislé zdroje. Můžete také upravit barvu zaškrtnutí, zaoblený pole a pozadí s lehkostí. Zde je kompletní 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];
        }
    }
}
Odpovězeno 23/07/2010 v 10:41
zdroj uživatelem

hlasů
0

Udělal jsem jednu v poslední době. Zdarma získat z GitHub. Uvidíme, jestli to pomůže. Efekt je podobný

zadejte popis obrázku zde

Odpovězeno 01/04/2019 v 20:36
zdroj uživatelem

hlasů
0

Uživatel Aruna LAKMAL; FYI, když přidáte tento kód do IB, jak byste popsat initWithFrame není volána, initWithCoder je. Implementovat initWithCoder a to bude fungovat, jak byste popsat.

Odpovězeno 20/01/2013 v 04:15
zdroj uživatelem

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