Веб-разработка в языке Common LISP является и эффективной и забавной.
Некоторые примеры:
сл - КОМУ позволяет Вам писать HTML, не забывая закрывающего тэга никогда снова.
Weblocks позволяет Вам определить формы декларативно со встроенной проверкой:
(defview signup (:type form :caption "Sign up")
(username :satisfies #'valid-username)
(password :present-as dual-password :parse-as dual-password)
(receive-newsletter-p :present-as checkbox :parse-as predicate))
Это также поддерживает Ajax полностью автоматическим способом, отступая к нормальным ссылкам, если браузер не поддерживает его.
распространенность статьи является невероятно простой альтернативой SQL.
Довольно много людей использует эти технологии в последнее время для важнейших приложений - с успехом.
самые важные проекты открытого исходного кода CL на самом деле имеют превосходную общественную поддержку.
Используйте два UILabel IBOutlet, каждый с разным форматом (шрифт / цвет / и т. Д.), По вашему желанию. Переместите второй по первому в зависимости от того, где заканчивается текст первого. Вы можете получить это через sizeWithFont: forWidth: lineBreakMode:
В качестве альтернативы вы можете создать подкласс UILabel и нарисовать текст самостоятельно в drawRect. Если вы сделаете это таким образом, просто добавьте переменную экземпляра, чтобы сообщить вам, какую часть строки нужно нарисовать в одном формате, а остальную часть - в другом.
Обновление: см. Ответ @Akshay ниже. Начиная с iOS6, UILabel может содержать NSMutableAttributedString. Когда я писал это, этого не было.
Обновление: если у вас iOS 6+, используйте UILabel.attributedText - иначе ....
Я создал этот базовый подкласс UIView для поддержки аналогичных функций.
Список вещей, которые он не поддерживает , длиннее, чем он делает, но в основном он позволяет вам управлять единственной строкой UILabels и форматировать каждую по своему усмотрению. Это позволяет, например, вставлять текст другого цвета в середине строки и избегать использования тяжелого UIWebView.
Я создаю эти объекты, помещая объект UIView в свой интерфейс (с помощью Interface Builder) и устанавливая тип объекта в IB равным MultipartLabel. Затем в коде я вызываю updateNumberOfLabels и различные селекторы setText по мере необходимости.
// MultipartLabel.m
// MultiLabelLabel
//
// Created by Jason Miller on 10/7/09.
// Copyright 2009 Jason Miller. All rights reserved.
//
#import "MultipartLabel.h"
@interface MultipartLabel (Private)
- (void)updateLayout;
@end
@implementation MultipartLabel
@synthesize containerView;
@synthesize labels;
-(void)updateNumberOfLabels:(int)numLabels;
{
[containerView removeFromSuperview];
self.containerView = nil;
self.containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)] autorelease];
[self addSubview:self.containerView];
self.labels = [NSMutableArray array];
while (numLabels-- > 0) {
UILabel * label = [[UILabel alloc] initWithFrame:CGRectZero];
[self.containerView addSubview:label];
[self.labels addObject:label];
[label release];
}
[self updateLayout];
}
-(void)setText:(NSString *)text forLabel:(int)labelNum;
{
if( [self.labels count] > labelNum && labelNum >= 0 )
{
UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
thisLabel.text = text;
}
[self updateLayout];
}
-(void)setText:(NSString *)text andFont:(UIFont*)font forLabel:(int)labelNum;
{
if( [self.labels count] > labelNum && labelNum >= 0 )
{
UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
thisLabel.text = text;
thisLabel.font = font;
}
[self updateLayout];
}
-(void)setText:(NSString *)text andColor:(UIColor*)color forLabel:(int)labelNum;
{
if( [self.labels count] > labelNum && labelNum >= 0 )
{
UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
thisLabel.text = text;
thisLabel.textColor = color;
}
[self updateLayout];
}
-(void)setText:(NSString *)text andFont:(UIFont*)font andColor:(UIColor*)color forLabel:(int)labelNum;
{
if( [self.labels count] > labelNum && labelNum >= 0 )
{
UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
thisLabel.text = text;
thisLabel.font = font;
thisLabel.textColor = color;
}
[self updateLayout];
}
- (void)updateLayout {
int thisX = 0;
// TODO when it is time to support different sized fonts, need to adjust each y value to line up baselines
for (UILabel * thisLabel in self.labels) {
CGSize size = [thisLabel.text sizeWithFont:thisLabel.font
constrainedToSize:CGSizeMake(9999, 9999)
lineBreakMode:thisLabel.lineBreakMode];
CGRect thisFrame = CGRectMake( thisX, 0, size.width, size.height );
thisLabel.frame = thisFrame;
thisX += size.width;
}
}
- (void)dealloc {
[labels release];
labels = nil;
[containerView release];
containerView = nil;
[super dealloc];
}
@end