Флажок в приложении для iOS

Альтернативное решение pthread_cond_broadcast() может быть следующим.

Вы определяете мьютекс для чтения и записи и блокируете его для записи в основном потоке перед созданием других потоков. Другие потоки попытаются получить блокировку чтения, но поскольку основной поток имеет блокировку записи, они будут заблокированы.

После создания всего потока основной поток снимает блокировку. Все остальные потоки будут активированы, и поскольку многие блокировки чтения могут сосуществовать, они будут выполняться одновременно (т.е. никто не будет заблокирован).

Код может быть что-то вроде:

pthread_rwlock_t lock; 

void handler(void *v) {
    if ((res = pthread_rwlock_rdlock(&lock)!=0)
    {
        exit(1);
    }
    printf("I am first! %d\n", v); 
    pthread_rwlock_unlock(&lock);
}


int main() {
    pthread_t t[threads];
    //First acquire the write lock:
    if ((res = pthread_rwlock_wrlock(&lock)!=0)
    {
        exit(1);
    }        
    for(int i =0; i < threads; i++)
    { 
        pthread_create(&t[i], NULL, handler, (void*) i); 
        //it is not clear if you want sleep inside the loop or not
        // You indented it as if to be inside but not put brackets
        sleep(2); 
    }
    pthread_rwlock_unlock(&lock); 
    for(int i =0; i < threads; i++) 
        pthread_join(t[i], NULL);
    pthread_rwlock_destroy(&lock);
    return 0; 
}
36
задан Seyyed Parsa Neshaei 3 August 2016 в 06:51
поделиться

5 ответов

Обычно Вы использовали бы UISwitch для подобной флажку функциональности.

Вы могли прокрутить свое собственное, хотя при помощи изображения управляют с двумя (проверенными/снятыми флажок) изображениями и переключение изображений, когда они касаются управления /

25
ответ дан Eric Petroelje 27 November 2019 в 05:23
поделиться

Если Вы показываете группу вариантов, и пользователь может выбрать одного из них, использовать tableview с аксессуаром галочки и другим цветом текста на выбранной строке.

, Если у Вас есть единственная опция, Ваш лучший выбор состоит в том, чтобы использовать переключатель. Если Вы не можете или не хотеть, использовать кнопку, устанавливая нормальное изображение на пустое поле и выбранное изображение к установленному флажку. Необходимо будет сделать те два изображения сами или найти, что графика запаса использует для них.

13
ответ дан Brent Royal-Gordon 27 November 2019 в 05:23
поделиться

это тоже сводило меня с ума, и я нашел другое решение, которое хорошо работает для меня и позволяет избежать необходимости использовать изображения.

  1. Добавьте новый объект label в Interface Builder.
  2. Создайте свойство IBOutlet в Xcode и подключите его к нему. В приведенном ниже коде я назвал его 'fullyPaid', так как хочу знать, полностью ли кто-то заплатил сумму денег.
  3. Добавьте 2 функции ниже. Функция 'touchesBegan' проверяет, коснулись ли вы где-нибудь внутри объекта метки 'fullyPaid', и если да, то вызывает функцию 'togglePaidStatus'. Функция 'togglePaidStatus' устанавливает две строки, которые содержат символы юникода, представляющие пустую (\u2610) и отмеченную (\u2611) ячейки соответственно. Затем она сравнивает, что сейчас находится в объекте 'fullyPaid' и переключает его с другой строкой.

Возможно, вы захотите вызвать функцию togglePaidStatus в функции viewDidLoad, чтобы изначально установить пустую строку.

Очевидно, вы можете добавить дополнительные проверки, чтобы предотвратить переключение пользователем флажка, если метка не включена, но это не показано ниже.

-(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];
}
32
ответ дан 27 November 2019 в 05:23
поделиться

Я хотел сделать это программно, а также решить проблему того, что область попадания была действительно слишком мала. Это адаптировано из разных источников, включая Майка и комментатора Майка Ага.

В вашем заголовке

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

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

-(void)toggleButton:(id)sender;

И в вашей реализации

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

И поместите этот метод тоже:

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

}
6
ответ дан 27 November 2019 в 05:23
поделиться

Мне нравится идея Адриана использовать символы, а не изображения. Но коробка мне не нравится, нужна только сама галочка (@ "\ u2713"). Я программно рисую рамку (закругленную рамку) и помещаю UILabel, внутри которого стоит галочка. Такой способ реализации позволяет легко использовать настраиваемое представление в любом приложении, не заботясь о каких-либо зависимых ресурсах. Вы также можете легко настроить цвет галочки, закругленного поля и фона. Вот полный код:

#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];
        }
    }
}
1
ответ дан 27 November 2019 в 05:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: