機能拡張 - iOS
要素ごとのレンダリングの変更
開発者は、TextBlock などのレンダリングされた AdaptiveCards 要素の外観をカスタマイズできます。 次の例は、NumberInput の背景色を変更する方法を示しています。
ACRRegistration *registration = [ACRRegistration getInstance];
// register custom renderer with registration
// custom renderer must implement ACRIBaseCardElementRenderer protocol
// for more information, please refer to CustomInputNumberRenderer.mm
[registration setBaseCardElementRenderer:[CustomInputNumberRenderer getInstance] cardElementType:ACRNumberInput];
...
/// CustiomInputNumberRenderer.mm
- (UIView *)render:(UIView<ACRIContentHoldingView> *)viewGroup
rootViewController:(UIViewController *)vc
inputs:(NSArray *)inputs
baseCardElement:(ACOBaseCardElement *)acoElem
hostConfig:(ACOHostConfig *)acoConfig
{
ACRInputNumberRenderer *defaultRenderer = [ACRInputNumberRenderer getInstance];
UIView *input = [defaultRenderer render:viewGroup
rootViewController:vc
inputs:inputs
baseCardElement:acoElem
hostConfig:acoConfig];
if(input)
{
// customize background color of input
[input setBackgroundColor: [UIColor colorWithRed:1.0
green:59.0/255.0
blue:48.0/255.0
alpha:1.0]];
}
return input;
}
その他のプロパティ
開発者は、json ペイロードの一部として追加のプロパティを送信できます。
たとえば、BaseCardElement の json ペイロードの "spacing" と "id" に加えて、TextBlock の角の半径を json ペイロードに追加できます。
追加のプロパティは NSData として返され、 と から accessbile が返 ACOBaseCardElement
されます ACOBaseActionElement
。 アクセスするには、NSData を NSDictionary に逆シリアル化する必要があります。
"type":"TextBlock",
...
"radius":20,
...
Objective-C の例
NSData *additionalProperty = [acoElem additionalProperty];
if(additionalProperty) {
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:additionalProperty options:NSJSONReadingMutableLeaves error:nil];
radiusForMyTextBlock = dictionary[@"radius"];
...
Swift の例
if let props = acoElem.additionalProperty() {
if let dictionary = try JSONSerialization .jsonObject(with: props, options: JSONSerialization.ReadingOptions.mutableLeaves) as? [NSString: Any]{
let radius = (dictionary["radius"] as! NSNumber).floatValue
}
カスタム解析
開発者は、カスタム解析を使用して、進行状況バーなどの新しい UI 要素を adpative カードに追加できます。 詳細については、CustomProgressBarRenderer.mm を確認してください。 カスタム パーサーは、ACOIBaseCardElementParser プロトコルを実装する必要があります。 deserializeToCustomElement メソッドは、NSData として指定された json ペイロードを解析し、AdaptiveCard レンダリング オブジェクトに追加される UIView オブジェクトへのポインターを返す必要があります。
CustomProgressBarRenderer *progressBarRenderer = [[CustomProgressBarRenderer alloc] init];
[registration setCustomElementParser:progressBarRenderer];
リソース リゾルバー
AdaptiveCards レンダラーのユーザーは、リソース リゾルバーを使用して、イメージの読み込みにより多くの制御を行います。
- ACOResourceResolvers を作成する
- ADCResolver を作成する
- ADCResolver を URL スキームごとに ACOResourceResolvers に登録します。スキームには任意の文字列を指定できます。
- ACOResourceResolvers を使用して ACOHostConfig の fromJson メソッドを呼び出す
ACOResourceResolvers resolvers = [[ACOResourceResolvers alloc] init];
ADCResolver *resolver = [[ADCResolver alloc] init];
[resolvers setResourceResolver:resolver scheme:@"http"];
[resolvers setResourceResolver:resolver scheme:@"https"];
[resolvers setResourceResolver:resolver scheme:@"data"];
// register a custom scheme bundle with resolver
[resolvers setResourceResolver:resolver scheme:@"bundle"];
ACOHostConfigParseResult *hostconfigParseResult = [ACOHostConfig fromJson:hostConfig
resourceResolvers:resolvers];
ADCResolver
- ACOIResourceResolver プロトコルを採用
- AdaptiveCards レンダラーは、 を介して UIImageView を確認します
(UIImageView *)resolveImageViewResource:(NSURL *)url
。 ADCResolver では、空の UIImage を使用して UIImageView を引き渡したり、UIImage を使用して UIImageView を渡したりできます。 - UIImage が空の場合、リゾルバーで UIImage が UIImageView に設定されている場合、レンダラーは KVO 経由で通知を受け取り、レイアウトの更新をトリガーします。
- 単純な objective-c の例
- (UIImageView *)resolveImageViewResource:(NSURL *)url
{
__block UIImageView *imageView = [[UIImageView alloc] init];
// check if custom scheme bundle exists
if ([url.scheme isEqualToString:@"bundle"]) {
// if bundle scheme, load an image from sample's main bundle
UIImage *image = [UIImage imageNamed:url.pathComponents.lastObject];
imageView.image = image;
} else {
NSURLSessionDownloadTask *downloadPhotoTask = [[NSURLSession sharedSession]
downloadTaskWithURL:url
completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error) {
// iOS uses NSInteger as HTTP URL status
NSInteger status = 200;
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
status = ((NSHTTPURLResponse *)response).statusCode;
}
if (!error && status == 200) {
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:location]];
if (image) {
dispatch_async(dispatch_get_main_queue(), ^{
imageView.image = image;
});
}
}
}];
[downloadPhotoTask resume];
}
return imageView;
}