2013-08-08 5 views
6

मैं कोडकैसे CATextLayer पाठ लंबवत स्थिति सेट करने के लिए?

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.textLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 90, 20, 20)]; 
    self.textLabel.text = @"1"; 
    self.textLabel.font = [UIFont systemFontOfSize:12]; 
    self.textLabel.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:self.textLabel]; 

    self.textLayer = [CATextLayer layer]; 
    [self.textLayer setString:@"1"]; 
    [self.textLayer setFont:(__bridge CFTypeRef)([UIFont systemFontOfSize:12])]; 
    self.textLayer.backgroundColor = [UIColor greenColor].CGColor; 
    self.textLayer.frame = CGRectMake(70, 90, 50, 20); 
    [self.view.layer addSublayer:self.textLayer]; 
} 

निम्नलिखित का उपयोग कर मेरे एप्लिकेशन में UILabel और CATextLayer बना सकते हैं और परिणाम

enter image description here

लाल एक UILabel है, हरे रंग की एक CALayer. I want to know how to vertical align the text in CALayer , as the UILabel` शो है।

+0

@Tark यह सवाल एक नकली नहीं है। यह सवाल आईओएस के संबंध में है। आईओएस आईओएस 11. के रूप में layoutManager उपलब्ध नहीं मिला है –

उत्तर

1

CATextLayer के दस्तावेज़ के अनुसार, वहाँ खड़ी एक पाठ संरेखित करने के लिए कोई विकल्प नहीं है। लेबल के साथ संरेखित करने के लिए टेक्स्ट लेयर को पुनर्स्थापित करना एकमात्र विकल्प है। यहाँ प्राप्त करने के लिए कोड है एक ही

CGFloat offsetY = 0; 
UIFont *textFont = [UIFont systemFontOfSize:14.0f]; 
//if system version is grater than 6 
if(([[[UIDevice currentDevice] systemVersion] compare:@"6" options:NSNumericSearch] == NSOrderedDescending)){ 
    offsetY = (textFont.capHeight - textFont.xHeight); 
} 

self.textLayer = [CATextLayer layer]; 
self.textLayer.backgroundColor = [UIColor greenColor].CGColor; 
self.textLayer.frame = CGRectMake(70, 90+offsetY, 50, 20); 
[self.view.layer addSublayer:self.textLayer]; 
[self.textLayer setContentsScale:[UIScreen mainScreen].scale]; 
[self.textLayer setForegroundColor: [UIColor blackColor].CGColor]; 
[self.textLayer setString:@"1"]; 
[self.textLayer setFont:(__bridge CFTypeRef)(textFont)]; 
[self.textLayer setFontSize:14.0f]; 

परिणाम

enter image description here

+0

बहुत उपयोगी है, धन्यवाद ... – Enix

2
{ 
    CATextLayer *label = [[CATextLayer alloc] init]; 
    [label setFont:@"Helvetica-Bold"]; 
    [label setFontSize:16]; 
    [label setFrame:NSMakeRect(0, 0, NSWidth(self.frame)/2., NSHeight(self.frame))]; 
    [label setString:@"ON"]; 
    [label setAlignmentMode:kCAAlignmentCenter]; 

    [label setForegroundColor:[[NSColor whiteColor] CGColor]]; 

    _rootLayer.layoutManager = [CAConstraintLayoutManager layoutManager]; 
    [label addConstraint:[CAConstraint 
          constraintWithAttribute:kCAConstraintMidY 
          relativeTo:@"superlayer" 
          attribute:kCAConstraintMidY]]; 
    [label addConstraint:[CAConstraint 
          constraintWithAttribute:kCAConstraintMidX relativeTo:@"superlayer" attribute:kCAConstraintMidX]]; 
    [_rootLayer addSublayer:label]; 

} 
+0

मैं iOS के लिए CAConstraint खोजने में परेशानी हो रही है यह केवल एक OSX वर्ग है? – amergin

+1

हाँ, iOS के लिए https://github.com/regexident/DLConstraintLayout को देखें –

6

है सही जवाब ऑब्जेक्टिव-सी में here पाया और iOS के लिए काम करता है है। यह CATextLayer उपवर्गीकरण और drawInContext समारोह अधिभावी द्वारा काम करता है।

हालांकि, मैं कोड में कुछ सुधार, जिन्हें आप नीचे, एक आधार के रूप डेविड Hoerl के कोड का उपयोग कर दिया है। परिवर्तन पूरी तरह से पाठ की ऊर्ध्वाधर स्थिति को पुन: गणना करने में आते हैं।

self.layer.addSublayer(textLayer) 
textLayer.font = font 
textLayer.fontSize = font.pointSize 
textLayer.frame = CGRectMake(self.layer.bounds.origin.x, ((self.layer.bounds.height - textLayer.fontSize)/2) - lineWidth, self.layer.bounds.width, self.layer.bounds.height) 
textLayer.alignmentMode - kCAAlignmentCenter 
textLayer.contentsScale = UIScreen.mainScreen().scale 

linewidth क्या मैं "फ्रेम" मेरी सीमांकन क्षेत्र के लिए उपयोग करते हैं:

class LCTextLayer : CATextLayer { 

// REF: http://lists.apple.com/archives/quartz-dev/2008/Aug/msg00016.html 
// CREDIT: David Hoerl - https://github.com/dhoerl 
// USAGE: To fix the vertical alignment issue that currently exists within the CATextLayer class. Change made to the yDiff calculation. 

override init!() { 
    super.init() 
} 

override init!(layer: AnyObject!) { 
    super.init(layer: layer) 
} 

required init(coder aDecoder: NSCoder) { 
    super.init(layer: aDecoder) 
} 

override func drawInContext(ctx: CGContext!) { 
    let height = self.bounds.size.height 
    let fontSize = self.fontSize 
    let yDiff = (height-fontSize)/2 - fontSize/10 

    CGContextSaveGState(ctx) 
    CGContextTranslateCTM(ctx, 0.0, yDiff) 
    super.drawInContext(ctx) 
    CGContextRestoreGState(ctx) 
} 
} 
7

वास्तव में, यह क्या मेरे लिए काम करता है:

यहाँ स्विफ्ट उपयोगकर्ताओं के लिए कोड है। यह मेरे पाठ को लंबवत और क्षैतिज केंद्रित केंद्रित रखता है। @ Iamktothed के जवाब की

0

स्विफ्ट 3 संस्करण:

class VerticallyCenteredTextLayer : CATextLayer { 

    // REF: http://lists.apple.com/archives/quartz-dev/2008/Aug/msg00016.html 
    // CREDIT: David Hoerl - https://github.com/dhoerl 
    // USAGE: To fix the vertical alignment issue that currently exists within the CATextLayer class. 

    override func draw(in ctx: CGContext) { 
     let fontSize = self.fontSize 
     let height = self.bounds.size.height 
     let deltaY = (height-fontSize)/2 - fontSize/10 

     ctx.saveGState() 
     ctx.translateBy(x: 0.0, y: deltaY) 
     super.draw(in: ctx) 
     ctx.restoreGState() 
    } 
} 
संबंधित मुद्दे