Несколько градиентов на одной и той же метке в Swift [дубликат]

Связанный .lib-файл связан с .dll

У меня была такая же проблема. Скажем, у меня есть проекты MyProject и TestProject. Я эффективно связал файл lib для MyProject с TestProject. Однако этот файл lib был создан, так как была построена DLL для MyProject. Кроме того, я не содержал исходный код для всех методов в MyProject, но только доступ к точкам входа DLL.

Чтобы решить проблему, я построил MyProject как LIB и связал TestProject с этим .lib-файлом (скопируйте вложенный файл .lib в папку TestProject). Затем я смогу снова создать MyProject как DLL. Он компилируется, поскольку lib, с которым связан TestProject, содержит код для всех методов в классах MyProject.

21
задан Nicola Miotto 25 November 2013 в 09:35
поделиться

6 ответов

Самый простой способ - создать подкласс UIView, который имеет свойство progress и перезаписывает -drawRect:.

Весь код, который вам нужен, следующий:

- (void)drawRect:(CGRect)rect {

    CGContextRef context = UIGraphicsGetCurrentContext();

    // Set up environment.
    CGSize size = [self bounds].size;
    UIColor *backgroundColor = [UIColor colorWithRed:108.0/255.0 green:200.0/255.0 blue:226.0/255.0 alpha:1.0];
    UIColor *foregroundColor = [UIColor whiteColor];
    UIFont *font = [UIFont boldSystemFontOfSize:42.0];

    // Prepare progress as a string.
    NSString *progress = [NSString stringWithFormat:@"%d%%", (int)round([self progress] * 100)];
    NSMutableDictionary *attributes = [@{ NSFontAttributeName : font } mutableCopy];
    CGSize textSize = [progress sizeWithAttributes:attributes];
    CGFloat progressX = ceil([self progress] * size.width);
    CGPoint textPoint = CGPointMake(ceil((size.width - textSize.width) / 2.0), ceil((size.height - textSize.height) / 2.0));

    // Draw background + foreground text
    [backgroundColor setFill];
    CGContextFillRect(context, [self bounds]);
    attributes[NSForegroundColorAttributeName] = foregroundColor;
    [progress drawAtPoint:textPoint withAttributes:attributes];

    // Clip the drawing that follows to the remaining progress' frame.
    CGContextSaveGState(context);
    CGRect remainingProgressRect = CGRectMake(progressX, 0.0, size.width - progressX, size.height);
    CGContextAddRect(context, remainingProgressRect);
    CGContextClip(context);

    // Draw again with inverted colors.
    [foregroundColor setFill];
    CGContextFillRect(context, [self bounds]);
    attributes[NSForegroundColorAttributeName] = backgroundColor;
    [progress drawAtPoint:textPoint withAttributes:attributes];

    CGContextRestoreGState(context);
}

- (void)setProgress:(CGFloat)progress {
    _progress = fminf(1.0, fmaxf(progress, 0.0));
    [self setNeedsDisplay];
}

Вы можете расширить класс по мере необходимости со свойствами для цвета фона, цвета текста, шрифта и т. д.

7
ответ дан Morten Fast 28 August 2018 в 02:09
поделиться

Чтобы сделать это проще без переопределения drawRect:, вы можете создать 2 UIViews, чтобы обойти это.

Синий фон UIView (A) содержит белый UILabel. (Обрезание субвью включено)

Белый фон UIView (B) содержит синий UILabel.

A будет накладываться на B.

Примечание: 2 UILabels будут иметь одинаковые размеры, одинаковые шрифты и одинаковые позиции.

Регулируя ширину UIView A, вы создадите панель процесса, как хотите.

1
ответ дан An Nguyen 28 August 2018 в 02:09
поделиться

Лучший и самый чистый способ сделать это - использовать маски. Иерархия представлений вашего индикатора выполнения должна выглядеть так:

  • Base Subview at index #1 Вид, показывающий прогресс Subview at index #2 UILabel с цветом текста так же, как и базовый Subview at index #3 UILabel с текстом цвет тот же, что и представление, показывающее прогресс

Мы будем применять маску к #3. Мы начинаем применять маску, как только представление, показывающее прогресс, достигнет кадра #3. Рамка маски должна следить за ходом. Когда #3 постепенно маскируется, ярлык внизу раскрывается, и вы достигаете эффекта красиво и с небольшим усилием. Здесь вы можете создать маски с CALayers .

0
ответ дан Community 28 August 2018 в 02:09
поделиться

Свифт 4 версии ответа Мортена:

class ProgressLabel: UIView {

    var progressBarColor = UIColor(red:108.0/255.0, green:200.0/255.0, blue:226.0/255.0, alpha:1.0)
    var textColor = UIColor.white
    var font = UIFont.boldSystemFont(ofSize: 42)


    var progress: Float = 0 {
        didSet {
            progress = Float.minimum(100.0, Float.maximum(progress, 0.0))
            self.setNeedsDisplay()
        }
    }

    override func draw(_ rect: CGRect) {
        let context = UIGraphicsGetCurrentContext()!

        // Set up environment.
        let size = self.bounds.size

        // Prepare progress as a string.
        let progressMessage = NSString(format:"%d %%", Int(progress))
        var attributes: [NSAttributedStringKey:Any] = [ NSAttributedStringKey.font : font ]
        let textSize = progressMessage.size(withAttributes: attributes)
        let progressX = ceil(CGFloat(progress) / 100 * size.width)
        let textPoint = CGPoint(x: ceil((size.width - textSize.width) / 2.0), y: ceil((size.height - textSize.height) / 2.0))

        // Draw background + foreground text
        progressBarColor.setFill()
        context.fill(self.bounds)
        attributes[NSAttributedStringKey.foregroundColor] = textColor
        progressMessage.draw(at: textPoint, withAttributes: attributes)

        // Clip the drawing that follows to the remaining progress' frame.
        context.saveGState()
        let remainingProgressRect = CGRect(x: progressX, y: 0.0, width: size.width - progressX, height: size.height)
        context.addRect(remainingProgressRect)
        context.clip()

        // Draw again with inverted colors.
        textColor.setFill()
        context.fill(self.bounds)
        attributes[NSAttributedStringKey.foregroundColor] = progressBarColor
        progressMessage.draw(at: textPoint, withAttributes: attributes)

        context.restoreGState()
    }
}
1
ответ дан nathan 28 August 2018 в 02:09
поделиться

Два UIViews.

  1. Назовем один фон, а другой - progressBar. progressBar укладывается поверх фона с одним и тем же источником в своем общем просмотре.
  2. Оба они имеют UILabel как subview, а обе метки одинаковы с родителями. background имеет темный backgroundColor, а на ярлыке - светлый textColor, а в представлении прогресса есть вещи наоборот.
  3. progressBar имеет более узкую ширину кадра, чем фон, и имеет клипы для изображений == YES

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

Отбросьте эти два представления в новый подкласс UIView под названием ReallyCoolProgressView и дать ему один открытый метод:

-(void)setProgress:(float)progress 

progress - это число от 0.0 до 1.0. Метод масштабирует ширину progressBar и устанавливает как текст ярлыка @ «Прогресс% f», прогресс * 100

3
ответ дан Pradhyuman sinh 28 August 2018 в 02:09
поделиться
2
ответ дан slecorne 28 August 2018 в 02:09
поделиться
Другие вопросы по тегам:

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