What is -[NSString sizeWithFont:forWidth:lineBreakMode:] good for?

后端 未结 4 1656
难免孤独
难免孤独 2020-11-28 22:51

In my question \"How do I get -[NSString sizeWithFont:forWidth:lineBreakMode:] to work?\", I learned that -[NSString sizeWithFont:constrainedToSize:lineBreakMode:]

4条回答
  •  萌比男神i
    2020-11-28 23:23

    Here's something I came up with after applying a few principles from PyjamaSam's example:

    AnnotationPin *myAnnotation = (AnnotationPin *)annotation;
    
    self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
    self.backgroundColor = [UIColor greenColor];
    self.frame = CGRectMake(0,0,30,30);
    imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE];
    imageView.frame = CGRectMake(3,3,20,20);
    imageView.layer.masksToBounds = NO;
    [self addSubview:imageView];
    [imageView release];
    
    CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
    CGRect newFrame = self.frame;
    newFrame.size.height = titleSize.height + 12;
    newFrame.size.width = titleSize.width + 32;
    self.frame = newFrame;
    self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor;
    self.layer.borderWidth = 3.0;
    
    UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)];
    infoLabel.text = myAnnotation.title;
    infoLabel.backgroundColor = [UIColor clearColor];
    infoLabel.textColor = [UIColor blackColor];
    infoLabel.textAlignment = UITextAlignmentCenter;
    infoLabel.font = [UIFont systemFontOfSize:12];
    
    [self addSubview:infoLabel];
    [infoLabel release];
    

    In this example, I'm adding a custom pin to a MKAnnotation class that resizes a UILabel according to the text size. It also adds an image on the left side of the view, so you see some of the code managing the proper spacing to handle the image and padding.

    The key is to use CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]]; and then redefine the view's dimensions. You can apply this logic to any view, but it doesn't handle linebreaks like Pyjama's.

    Although Pyjama's answer works for some, it didn't work for me. This is a detailed explanation that you should try immediately before going anywhere else if you want a dynamic custom MKAnnotation pin with an image and resizable UILabel.

提交回复
热议问题