Attach and position embedded UIVIews (flutter/engine#6614)

This commit is contained in:
Amir Hardon
2018-10-26 14:45:17 -07:00
committed by GitHub
parent 3e93cdffaa
commit 3c150f1c20
5 changed files with 33 additions and 4 deletions

View File

@@ -6,11 +6,15 @@
#define FLUTTER_FLOW_EMBEDDED_VIEWS_H_
#include "flutter/fml/memory/ref_counted.h"
#include "third_party/skia/include/core/SkPoint.h"
#include "third_party/skia/include/core/SkSize.h"
namespace flow {
class EmbeddedViewParams {
public:
SkPoint offsetPixels;
SkSize sizePoints;
};
// This is only used on iOS when running in a non headless mode,

View File

@@ -23,6 +23,11 @@ void PlatformViewLayer::Paint(PaintContext& context) const {
return;
}
EmbeddedViewParams params;
SkMatrix transform = context.canvas.getTotalMatrix();
params.offsetPixels =
SkPoint::Make(transform.getTranslateX(), transform.getTranslateY());
params.sizePoints = size_;
context.view_embedder->CompositeEmbeddedView(view_id_, params);
}
} // namespace flow

View File

@@ -13,7 +13,9 @@
namespace shell {
FlutterPlatformViewsController::FlutterPlatformViewsController(
NSObject<FlutterBinaryMessenger>* messenger) {
NSObject<FlutterBinaryMessenger>* messenger,
FlutterView* flutter_view)
: flutter_view_([flutter_view retain]) {
channel_.reset([[FlutterMethodChannel alloc]
initWithName:@"flutter/platform_views"
binaryMessenger:messenger
@@ -58,6 +60,9 @@ void FlutterPlatformViewsController::OnCreate(FlutterMethodCall* call, FlutterRe
views_[viewId] = fml::scoped_nsobject<UIView>([[factory createWithFrame:CGRectZero
viewIdentifier:viewId
arguments:nil] retain]);
FlutterView* flutter_view = flutter_view_.get();
[flutter_view addSubview:views_[viewId].get()];
result(nil);
}
@@ -72,6 +77,8 @@ void FlutterPlatformViewsController::OnDispose(FlutterMethodCall* call, FlutterR
return;
}
UIView* view = views_[viewId].get();
[view removeFromSuperview];
views_.erase(viewId);
result(nil);
}
@@ -87,7 +94,16 @@ void FlutterPlatformViewsController::RegisterViewFactory(
void FlutterPlatformViewsController::CompositeEmbeddedView(int view_id,
const flow::EmbeddedViewParams& params) {
// TODO(amirh): implement this.
// TODO(amirh): assert that this is running on the platform thread once we support the iOS
// embedded views thread configuration.
// TODO(amirh): do nothing if the params didn't change.
CGFloat screenScale = [[UIScreen mainScreen] scale];
CGRect rect =
CGRectMake(params.offsetPixels.x() / screenScale, params.offsetPixels.y() / screenScale,
params.sizePoints.width(), params.sizePoints.height());
UIView* view = views_[view_id];
[view setFrame:rect];
}
} // namespace shell

View File

@@ -5,6 +5,7 @@
#ifndef FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERPLATFORMVIEWS_INTERNAL_H_
#define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_SOURCE_FLUTTERPLATFORMVIEWS_INTERNAL_H_
#include "FlutterView.h"
#include "flutter/flow/embedded_views.h"
#include "flutter/fml/platform/darwin/scoped_nsobject.h"
#include "flutter/shell/common/shell.h"
@@ -16,7 +17,8 @@ namespace shell {
class FlutterPlatformViewsController : public flow::ExternalViewEmbedder {
public:
FlutterPlatformViewsController(NSObject<FlutterBinaryMessenger>* messenger);
FlutterPlatformViewsController(NSObject<FlutterBinaryMessenger>* messenger,
FlutterView* flutter_view);
void RegisterViewFactory(NSObject<FlutterPlatformViewFactory>* factory, NSString* factoryId);
@@ -24,6 +26,7 @@ class FlutterPlatformViewsController : public flow::ExternalViewEmbedder {
private:
fml::scoped_nsobject<FlutterMethodChannel> channel_;
fml::scoped_nsobject<FlutterView> flutter_view_;
std::map<std::string, fml::scoped_nsobject<NSObject<FlutterPlatformViewFactory>>> factories_;
std::map<int64_t, fml::scoped_nsobject<UIView>> views_;

View File

@@ -113,7 +113,8 @@
_statusBarStyle = UIStatusBarStyleDefault;
[self setupNotificationCenterObservers];
_platformViewsController.reset(new shell::FlutterPlatformViewsController(_engine.get()));
_platformViewsController.reset(
new shell::FlutterPlatformViewsController(_engine.get(), _flutterView.get()));
}
- (fml::scoped_nsobject<FlutterEngine>)engine {