SORU
25 AĞUSTOS 2011, PERŞEMBE


Nasıl iOS uygulaması için UİLabel için üst-sol hizalamasını ayarlamak için?

Uç benim dosyaya bir etiket, daha sonra gerekli üst-sol ve alternatifler için hizalama için ekledik. Zamanı o kadar emin değil ne kadar çizgileri de metin sunuyorum. Eğer sadece tek bir metin satırı varsa o zaman dikey-merkezi hizalanmış gibi görünüyor. Bu hizalama önünde ilgili benim ve alternatifler ile eşleşen.

Örneğin:

enter image description here

Tuhaf görünümlü olan :(

Etiket metni Üst-Sol hizalamasını ayarlamak için uygun olabilir herhangi bir yolu var mı?

CEVAP
26 AĞUSTOS 2011, Cuma


Bunu yapmak oldukça kolay. verticalAlignment özelliği ile UILabel sublcass oluşturmak ve textRectForBounds:limitedToNumberOfLines üst, orta veya alt dikey hizalama için doğru sınırları dönmek için geçersiz kılar. İşte kod:

SOLabel.h

#import <UIKit/UIKit.h>

typedef enum
{
    VerticalAlignmentTop = 0, // default
    VerticalAlignmentMiddle,
    VerticalAlignmentBottom,
} VerticalAlignment;

@interface SOLabel : UILabel

   @property (nonatomic, readwrite) VerticalAlignment verticalAlignment;

@end

SOLabel.m

@implementation SOLabel

-(id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (!self) return nil;

    // set inital value via IVAR so the setter isn't called
    _verticalAlignment = VerticalAlignmentTop;

    return self;
}

-(VerticalAlignment) verticalAlignment
{
    return _verticalAlignment;
}

-(void) setVerticalAlignment:(VerticalAlignment)value
{
    _verticalAlignment = value;
    [self setNeedsDisplay];
}

// align text block according to vertical alignment settings
-(CGRect)textRectForBounds:(CGRect)bounds 
    limitedToNumberOfLines:(NSInteger)numberOfLines
{
   CGRect rect = [super textRectForBounds:bounds 
                   limitedToNumberOfLines:numberOfLines];
    CGRect result;
    switch (_verticalAlignment)
    {
       case VerticalAlignmentTop:
          result = CGRectMake(bounds.origin.x, bounds.origin.y, 
                              rect.size.width, rect.size.height);
           break;

       case VerticalAlignmentMiddle:
          result = CGRectMake(bounds.origin.x, 
                    bounds.origin.y   (bounds.size.height - rect.size.height) / 2,
                    rect.size.width, rect.size.height);
          break;

       case VerticalAlignmentBottom:
          result = CGRectMake(bounds.origin.x, 
                    bounds.origin.y   (bounds.size.height - rect.size.height),
                    rect.size.width, rect.size.height);
          break;

       default:
          result = bounds;
          break;
    }
    return result;
}

-(void)drawTextInRect:(CGRect)rect
{
    CGRect r = [self textRectForBounds:rect 
                limitedToNumberOfLines:self.numberOfLines];
    [super drawTextInRect:r];
}

@end

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CorridorDigital

    CorridorDigi

    17 Mayıs 2010
  • HouseholdHacker

    HouseholdHac

    6 Kasım 2007
  • NYCarspotter

    NYCarspotter

    26 EYLÜL 2011