Attach and position embedded UIVIews (flutter/engine#6614)
This commit is contained in:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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_;
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user