From a69e9a3cee6593084b64837e4781ed74f28d7b2a Mon Sep 17 00:00:00 2001 From: Ilya Grechuhin Date: Mon, 16 Jan 2017 18:43:52 +0300 Subject: [MAPSME-657] [ios] Added visible area support. --- .../Views/RoutePreview/MWMRoutePreview.mm | 10 ++- iphone/Maps/Classes/EAGLView.mm | 2 - iphone/Maps/Classes/MapViewController.h | 1 + iphone/Maps/Classes/MapViewController.mm | 18 ++++- iphone/Maps/Core/Framework/MWMFrameworkHelper.h | 2 + iphone/Maps/Core/Framework/MWMFrameworkHelper.mm | 11 +++ iphone/Maps/Maps.xcodeproj/project.pbxproj | 24 +++++++ iphone/Maps/UI/Mapsme.storyboard | 31 ++++++--- iphone/Maps/UI/PlacePage/MWMPlacePageManager.mm | 1 + .../MWMiPhonePlacePageLayoutImpl.mm | 3 +- .../PlacePageLayout/PlacePageView/MWMPPView.mm | 10 ++- iphone/Maps/UI/Search/MWMSearchView.xib | 6 +- iphone/Maps/UI/Search/SearchBar.swift | 6 ++ iphone/Maps/UI/VisibleArea/VisibleArea.swift | 81 ++++++++++++++++++++++ 14 files changed, 188 insertions(+), 18 deletions(-) create mode 100644 iphone/Maps/UI/Search/SearchBar.swift create mode 100644 iphone/Maps/UI/VisibleArea/VisibleArea.swift (limited to 'iphone') diff --git a/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMRoutePreview.mm b/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMRoutePreview.mm index 7628724431..235421dfa8 100644 --- a/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMRoutePreview.mm +++ b/iphone/Maps/Classes/CustomViews/NavigationDashboard/Views/RoutePreview/MWMRoutePreview.mm @@ -1,12 +1,13 @@ #import "MWMRoutePreview.h" -#import "MWMCommon.h" #import "MWMCircularProgress.h" +#import "MWMCommon.h" #import "MWMNavigationDashboardManager.h" #import "MWMRoutePointCell.h" #import "MWMRoutePointLayout.h" #import "MWMRouter.h" #import "MWMTaxiPreviewDataSource.h" #import "Statistics.h" +#import "SwiftBridge.h" #import "UIButton+Orientation.h" #import "UIImageView+Coloring.h" @@ -481,4 +482,11 @@ CGFloat constexpr kAdditionalHeight = 20.; return cell; } +#pragma mark - VisibleArea + +- (MWMVisibleAreaAffectDirection)visibleAreaAffectDirection +{ + return IPAD ? MWMVisibleAreaAffectDirectionLeft : MWMVisibleAreaAffectDirectionTop; +} + @end diff --git a/iphone/Maps/Classes/EAGLView.mm b/iphone/Maps/Classes/EAGLView.mm index cc3829aea3..13d6029b2d 100644 --- a/iphone/Maps/Classes/EAGLView.mm +++ b/iphone/Maps/Classes/EAGLView.mm @@ -110,8 +110,6 @@ double getExactDPI(double contentScaleFactor) dispatch_async(dispatch_get_main_queue(), ^ { GetFramework().OnSize(width, height); - // TODO: Temporary realization of visible viewport, this code must be removed later. - GetFramework().SetVisibleViewport(m2::RectD(0.0, 0.0, width, height)); [self.widgetsManager resize:CGSizeMake(width, height)]; self->_drapeEngineCreated = YES; }); diff --git a/iphone/Maps/Classes/MapViewController.h b/iphone/Maps/Classes/MapViewController.h index 2a65449e45..c2599aaae1 100644 --- a/iphone/Maps/Classes/MapViewController.h +++ b/iphone/Maps/Classes/MapViewController.h @@ -40,5 +40,6 @@ struct AddressInfo; @property(nonatomic, readonly) MWMMapViewControlsManager * controlsManager; @property(nonatomic) MWMAPIBar * apiBar; @property(nonatomic) MWMWelcomePageController * welcomePageController; +@property(nonatomic) CGFloat visibleAreaBottomOffset; @end diff --git a/iphone/Maps/Classes/MapViewController.mm b/iphone/Maps/Classes/MapViewController.mm index 7036f13a5b..e679600e2d 100644 --- a/iphone/Maps/Classes/MapViewController.mm +++ b/iphone/Maps/Classes/MapViewController.mm @@ -1,16 +1,17 @@ #import "MapViewController.h" #import "BookmarksRootVC.h" #import "BookmarksVC.h" -#import "MWMCommon.h" #import "EAGLView.h" #import "MWMAPIBar.h" #import "MWMAlertViewController.h" #import "MWMAuthorizationCommon.h" #import "MWMAuthorizationLoginViewController.h" #import "MWMAuthorizationWebViewLoginViewController.h" +#import "MWMCommon.h" #import "MWMEditBookmarkController.h" #import "MWMEditorViewController.h" #import "MWMFrameworkListener.h" +#import "MWMKeyboard.h" #import "MWMLocationHelpers.h" #import "MWMLocationManager.h" #import "MWMMapDownloadDialog.h" @@ -94,7 +95,7 @@ BOOL gIsFirstMyPositionMode = YES; @end @interface MapViewController () + MWMWelcomePageControllerProtocol, MWMKeyboardObserver> @property(nonatomic, readwrite) MWMMapViewControlsManager * controlsManager; @@ -106,6 +107,9 @@ BOOL gIsFirstMyPositionMode = YES; @property(nonatomic) BOOL skipForceTouch; +@property(weak, nonatomic) IBOutlet NSLayoutConstraint * visibleAreaBottom; +@property(weak, nonatomic) IBOutlet NSLayoutConstraint * visibleAreaKeyboard; + @end @implementation MapViewController @@ -266,6 +270,7 @@ BOOL gIsFirstMyPositionMode = YES; [super viewDidLoad]; self.view.clipsToBounds = YES; [self processMyPositionStateModeEvent:location::PendingPosition]; + [MWMKeyboard addObserver:self]; } - (void)mwm_refreshUI @@ -543,6 +548,9 @@ BOOL gIsFirstMyPositionMode = YES; } } +#pragma mark - MWMKeyboard + +- (void)onKeyboardAnimation { self.visibleAreaKeyboard.constant = [MWMKeyboard keyboardHeight]; } #pragma mark - Properties - (MWMMapViewControlsManager *)controlsManager @@ -562,4 +570,10 @@ BOOL gIsFirstMyPositionMode = YES; return _downloadDialog; } +- (CGFloat)visibleAreaBottomOffset { return self.visibleAreaBottom.constant; } +- (void)setVisibleAreaBottomOffset:(CGFloat)visibleAreaBottomOffset +{ + self.visibleAreaBottom.constant = visibleAreaBottomOffset; +} + @end diff --git a/iphone/Maps/Core/Framework/MWMFrameworkHelper.h b/iphone/Maps/Core/Framework/MWMFrameworkHelper.h index 3d1ff0fd6d..63bd5bffc2 100644 --- a/iphone/Maps/Core/Framework/MWMFrameworkHelper.h +++ b/iphone/Maps/Core/Framework/MWMFrameworkHelper.h @@ -2,4 +2,6 @@ + (void)zoomToCurrentPosition; ++ (void)setVisibleViewport:(CGRect)rect; + @end diff --git a/iphone/Maps/Core/Framework/MWMFrameworkHelper.mm b/iphone/Maps/Core/Framework/MWMFrameworkHelper.mm index aab338b735..4e27411e51 100644 --- a/iphone/Maps/Core/Framework/MWMFrameworkHelper.mm +++ b/iphone/Maps/Core/Framework/MWMFrameworkHelper.mm @@ -1,6 +1,7 @@ #import "MWMFrameworkHelper.h" #import "CLLocation+Mercator.h" #import "MWMLocationManager.h" +#import "MapViewController.h" #include "Framework.h" @@ -16,4 +17,14 @@ f.SetViewportCenter(lastLocation.mercator, 13 /* zoom */); } ++ (void)setVisibleViewport:(CGRect)rect +{ + CGFloat const scale = [MapViewController controller].view.contentScaleFactor; + CGFloat const x1 = rect.origin.x * scale; + CGFloat const y1 = rect.origin.y * scale; + CGFloat const x2 = x1 + rect.size.width * scale; + CGFloat const y2 = y1 + rect.size.height * scale; + GetFramework().SetVisibleViewport(m2::RectD(x1, y1, x2, y2)); +} + @end diff --git a/iphone/Maps/Maps.xcodeproj/project.pbxproj b/iphone/Maps/Maps.xcodeproj/project.pbxproj index 60b5a332f8..51018df849 100644 --- a/iphone/Maps/Maps.xcodeproj/project.pbxproj +++ b/iphone/Maps/Maps.xcodeproj/project.pbxproj @@ -260,6 +260,12 @@ 349C3AED1D33A933002AC7A9 /* MWMNavigationInfoView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 349C3AEB1D33A933002AC7A9 /* MWMNavigationInfoView.mm */; }; 349C3AEF1D33A96B002AC7A9 /* MWMNavigationInfoView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 349C3AEE1D33A96B002AC7A9 /* MWMNavigationInfoView.xib */; }; 349C3AF01D33A96B002AC7A9 /* MWMNavigationInfoView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 349C3AEE1D33A96B002AC7A9 /* MWMNavigationInfoView.xib */; }; + 349D1AB71E2CB6E0004A2006 /* VisibleArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349D1AB61E2CB6E0004A2006 /* VisibleArea.swift */; }; + 349D1AB81E2CB6E0004A2006 /* VisibleArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349D1AB61E2CB6E0004A2006 /* VisibleArea.swift */; }; + 349D1AB91E2CB6E0004A2006 /* VisibleArea.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349D1AB61E2CB6E0004A2006 /* VisibleArea.swift */; }; + 349D1ABB1E2D05EF004A2006 /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349D1ABA1E2D05EF004A2006 /* SearchBar.swift */; }; + 349D1ABC1E2D05EF004A2006 /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349D1ABA1E2D05EF004A2006 /* SearchBar.swift */; }; + 349D1ABD1E2D05EF004A2006 /* SearchBar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 349D1ABA1E2D05EF004A2006 /* SearchBar.swift */; }; 34AB39C11D2BD8310021857D /* MWMStopButton.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34AB39C01D2BD8310021857D /* MWMStopButton.mm */; }; 34AB39C21D2BD8310021857D /* MWMStopButton.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34AB39C01D2BD8310021857D /* MWMStopButton.mm */; }; 34ABA6161C2D185C00FE1BEC /* MWMAuthorizationOSMLoginViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 34ABA6151C2D185B00FE1BEC /* MWMAuthorizationOSMLoginViewController.mm */; }; @@ -1567,6 +1573,8 @@ 349C3AEB1D33A933002AC7A9 /* MWMNavigationInfoView.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMNavigationInfoView.mm; sourceTree = ""; }; 349C3AEE1D33A96B002AC7A9 /* MWMNavigationInfoView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MWMNavigationInfoView.xib; sourceTree = ""; }; 349C3AF11D33C6EE002AC7A9 /* MWMNavigationDashboardInfoProtocol.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MWMNavigationDashboardInfoProtocol.h; sourceTree = ""; }; + 349D1AB61E2CB6E0004A2006 /* VisibleArea.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VisibleArea.swift; sourceTree = ""; }; + 349D1ABA1E2D05EF004A2006 /* SearchBar.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchBar.swift; sourceTree = ""; }; 34AB39BF1D2BD8310021857D /* MWMStopButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMStopButton.h; sourceTree = ""; }; 34AB39C01D2BD8310021857D /* MWMStopButton.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MWMStopButton.mm; sourceTree = ""; }; 34ABA6141C2D185B00FE1BEC /* MWMAuthorizationOSMLoginViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MWMAuthorizationOSMLoginViewController.h; sourceTree = ""; }; @@ -2933,6 +2941,14 @@ path = BottomMenu; sourceTree = ""; }; + 349D1AB51E2CB407004A2006 /* VisibleArea */ = { + isa = PBXGroup; + children = ( + 349D1AB61E2CB6E0004A2006 /* VisibleArea.swift */, + ); + path = VisibleArea; + sourceTree = ""; + }; 34ABA60F1C2D17C200FE1BEC /* Login */ = { isa = PBXGroup; children = ( @@ -3245,6 +3261,7 @@ F6E2FBFB1E097B9F0083EBEC /* UI */ = { isa = PBXGroup; children = ( + 349D1AB51E2CB407004A2006 /* VisibleArea */, F6E2FBFC1E097B9F0083EBEC /* Downloader */, F6E2FC291E097B9F0083EBEC /* EditBookmark */, F6E2FC321E097B9F0083EBEC /* Editor */, @@ -3690,6 +3707,7 @@ F6E2FD241E097BA00083EBEC /* TabButtons */, F6E2FD281E097BA00083EBEC /* TableView */, 34845DB11E165E24003D55B9 /* SearchNoResultsViewController.swift */, + 349D1ABA1E2D05EF004A2006 /* SearchBar.swift */, ); path = Search; sourceTree = ""; @@ -4691,6 +4709,7 @@ 46F26CD810F623BA00ECCA39 /* EAGLView.mm in Sources */, EED10A4511F78D120095FAD4 /* MapViewController.mm in Sources */, F61579341AC2CE9A0032D8E9 /* MWMRateAlert.mm in Sources */, + 349D1ABB1E2D05EF004A2006 /* SearchBar.swift in Sources */, F6E2FD791E097BA00083EBEC /* MWMMapDownloaderDefaultDataSource.mm in Sources */, F6E2FF3E1E097BA00083EBEC /* MWMSearchTableViewController.mm in Sources */, F6E2FDAC1E097BA00083EBEC /* MWMEditorAddAdditionalNameTableViewCell.mm in Sources */, @@ -4748,6 +4767,7 @@ F6BD33811B62403B00F2CE18 /* MWMRoutePreview.mm in Sources */, F6E2FD8B1E097BA00083EBEC /* MWMNoMapsView.mm in Sources */, F6BB6CC31BB1860D00DF1DF2 /* MWMRoutePointLayout.mm in Sources */, + 349D1AB71E2CB6E0004A2006 /* VisibleArea.swift in Sources */, F6E2FD701E097BA00083EBEC /* MWMMapDownloaderTableViewCell.mm in Sources */, F6E2FE4E1E097BA00083EBEC /* MWMActionBarButton.mm in Sources */, 34BF0CC61C31304A00D097EB /* MWMAuthorizationCommon.mm in Sources */, @@ -4941,6 +4961,7 @@ 6741A9B71BF340DE002C974C /* EAGLView.mm in Sources */, 6741A9B81BF340DE002C974C /* MapViewController.mm in Sources */, 6741A9B91BF340DE002C974C /* MWMRateAlert.mm in Sources */, + 349D1ABC1E2D05EF004A2006 /* SearchBar.swift in Sources */, F6E2FD7A1E097BA00083EBEC /* MWMMapDownloaderDefaultDataSource.mm in Sources */, F6E2FF3F1E097BA00083EBEC /* MWMSearchTableViewController.mm in Sources */, F6E2FDAD1E097BA00083EBEC /* MWMEditorAddAdditionalNameTableViewCell.mm in Sources */, @@ -4998,6 +5019,7 @@ F6E2FD8C1E097BA00083EBEC /* MWMNoMapsView.mm in Sources */, 6741A9DB1BF340DE002C974C /* MWMRoutePreview.mm in Sources */, 6741A9DC1BF340DE002C974C /* MWMRoutePointLayout.mm in Sources */, + 349D1AB81E2CB6E0004A2006 /* VisibleArea.swift in Sources */, F6E2FD711E097BA00083EBEC /* MWMMapDownloaderTableViewCell.mm in Sources */, F6E2FE4F1E097BA00083EBEC /* MWMActionBarButton.mm in Sources */, 340475531E081A4600C92850 /* MWMCustomFacebookEvents.mm in Sources */, @@ -5191,6 +5213,7 @@ 849CF6A01DE842290024A8A5 /* EAGLView.mm in Sources */, 849CF6A21DE842290024A8A5 /* MapViewController.mm in Sources */, 3404757F1E081B3300C92850 /* iosOGLContext.mm in Sources */, + 349D1ABD1E2D05EF004A2006 /* SearchBar.swift in Sources */, F6E2FD7B1E097BA00083EBEC /* MWMMapDownloaderDefaultDataSource.mm in Sources */, F6E2FF401E097BA00083EBEC /* MWMSearchTableViewController.mm in Sources */, F6E2FDAE1E097BA00083EBEC /* MWMEditorAddAdditionalNameTableViewCell.mm in Sources */, @@ -5248,6 +5271,7 @@ F6E2FE261E097BA00083EBEC /* MWMOpeningHoursModel.mm in Sources */, 849CF6D51DE842290024A8A5 /* MWMTableViewController.mm in Sources */, F6E2FD8D1E097BA00083EBEC /* MWMNoMapsView.mm in Sources */, + 349D1AB91E2CB6E0004A2006 /* VisibleArea.swift in Sources */, 849CF6D81DE842290024A8A5 /* MWMSegue.mm in Sources */, F6E2FD721E097BA00083EBEC /* MWMMapDownloaderTableViewCell.mm in Sources */, F6E2FE501E097BA00083EBEC /* MWMActionBarButton.mm in Sources */, diff --git a/iphone/Maps/UI/Mapsme.storyboard b/iphone/Maps/UI/Mapsme.storyboard index dcd8941ae7..82f55dd520 100644 --- a/iphone/Maps/UI/Mapsme.storyboard +++ b/iphone/Maps/UI/Mapsme.storyboard @@ -28,10 +28,25 @@ + + + + + + + + + + + + @@ -46,7 +61,7 @@ - + @@ -421,18 +436,18 @@ - + - + diff --git a/iphone/Maps/UI/Search/SearchBar.swift b/iphone/Maps/UI/Search/SearchBar.swift new file mode 100644 index 0000000000..d2fa0bb167 --- /dev/null +++ b/iphone/Maps/UI/Search/SearchBar.swift @@ -0,0 +1,6 @@ +import UIKit + +class SearchBar: SolidTouchView { + + override var visibleAreaAffectDirection: VisibleArea.Direction { return IPAD() ? .left : .top } +} diff --git a/iphone/Maps/UI/VisibleArea/VisibleArea.swift b/iphone/Maps/UI/VisibleArea/VisibleArea.swift new file mode 100644 index 0000000000..e5770c936b --- /dev/null +++ b/iphone/Maps/UI/VisibleArea/VisibleArea.swift @@ -0,0 +1,81 @@ +import UIKit + +class VisibleArea: UIView { + + @objc(MWMVisibleAreaAffectDirection) + enum Direction: Int { + + case none + case top + case bottom + case left + case right + } + + private let observeKeyPath = "sublayers" + + private var affectingViews = Set() + + override func didMoveToSuperview() { + super.didMoveToSuperview() + subscribe() + update() + } + + deinit { + unsubscribe() + } + + private func subscribe() { + guard let ol = superview?.layer else { return } + ol.addObserver(self, forKeyPath: observeKeyPath, options: .new, context: nil) + } + + private func unsubscribe() { + guard let ol = superview?.layer else { return } + ol.removeObserver(self, forKeyPath: observeKeyPath) + } + + override func observeValue(forKeyPath keyPath: String?, of _: Any?, change _: [NSKeyValueChangeKey: Any]?, context _: UnsafeMutableRawPointer?) { + if keyPath == observeKeyPath { + DispatchQueue.main.async { + self.update() + } + } + } + + private func update() { + guard let sv = superview else { return } + let newAVs = Set(sv.subviews.filter { $0.visibleAreaAffectDirection != .none }) + newAVs.subtracting(affectingViews).forEach { addAffectingView($0.visibleAreaAffectView) } + affectingViews = newAVs + } + + private func addAffectingView(_ other: UIView?) { + guard let ov = other else { return } + let sa: NSLayoutAttribute + let oa: NSLayoutAttribute + let rel: NSLayoutRelation + switch ov.visibleAreaAffectDirection { + case .none: return + case .top: (sa, oa, rel) = (.top, .bottom, .greaterThanOrEqual) + case .bottom: (sa, oa, rel) = (.bottom, .top, .lessThanOrEqual) + case .left: (sa, oa, rel) = (.left, .right, .greaterThanOrEqual) + case .right: (sa, oa, rel) = (.right, .left, .lessThanOrEqual) + } + NSLayoutConstraint(item: self, attribute: sa, relatedBy: rel, toItem: ov, attribute: oa, multiplier: 1, constant: 0).isActive = true + } + + override func layoutSubviews() { + super.layoutSubviews() + print(frame) + MWMFrameworkHelper.setVisibleViewport(frame) + } +} + +extension UIView { + + var visibleAreaAffectDirection: VisibleArea.Direction { return .none } + + var visibleAreaAffectView: UIView { return self } +} -- cgit v1.2.3