Question: Question:
I would like to dynamically change the line height with SWift according to the number of characters.
The target will be compatible with both iOS 7 and iOS 8.
So I wrote the following code, but I got an error and couldn't use it.
There is no problem if you specify either option, but this time it seems that you need both.
let options: NSStringDrawingOptions = (NSStringDrawingOptions.UsesLineFragmentOrigin | NSStringDrawingOptions.UsesFontLeading)
When I investigated this error, I found information that it was a bug in iOS 7.
So when I tried to make only this part of the code an Objective-C class,
NSStringDrawingOptions gives the error Expected as type. Is there a way to get it through?
Bridging-Header is created, and other classes (SDWebImage etc.) are working safely, so I think that there is no problem.
Thank you.
The code is below.
DrawingOptions.h
#import <Foundation/Foundation.h>
@interface StringDrawingOptions : NSObject
+ (NSStringDrawingOptions)combine:(NSStringDrawingOptions)option1 with:(NSStringDrawingOptions)option2;
@end
DrawingOptions.m
#import "StringDrawingOptions.h"
@implementation StringDrawingOptions
+ (NSStringDrawingOptions)combine:(NSStringDrawingOptions)option1 with:(NSStringDrawingOptions)option2
{
return (option1 | option2);
}
@end
Answer: Answer:
I think the error message Expected a type
appears in DrawingOptions.h, so add #import <UIKit/UIKit.h>
to the import statement in DrawingOptions.h.
NSStringDrawingOptions
is an extension of UIKit, so you can't see the definition of NSStringDrawingOptions without importing UIKit.
Next, StringDrawingOptions is needed because it's a Swift bug (strictly speaking, the definition of NSStringDrawingOptions
is wrong).
let options:NSStringDrawingOptions = (NSStringDrawingOptions.UsesLineFragmentOrigin | NSStringDrawingOptions.UsesFontLeading)
The part of
let options = StringDrawingOptions.combine(.UsesLineFragmentOrigin, with: .UsesFontLeading)
And, let's calculate the bitmask using the Objective-C method defined in StringDrawingOptions.