機能拡張 - 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 レンダラーのユーザーは、リソース リゾルバーを使用して、イメージの読み込みにより多くの制御を行います。

  1. ACOResourceResolvers を作成する
  2. ADCResolver を作成する
  3. ADCResolver を URL スキームごとに ACOResourceResolvers に登録します。スキームには任意の文字列を指定できます。
  4. 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;
}