我正在GMSMarker pin上播放视频,下面是我的代码。显示和隐藏/显示引脚视图,一切正常。视频不播放除外。我正在使用带有pinview的故事板。
@interface MapViewController () <GMSMapViewDelegate>
@property (strong, nonatomic) IBOutlet GMSMapView *mapView;
@property (strong, nonatomic) IBOutlet UIView *pinView;
@property (strong, nonatomic) GMSMarker *london;
@property (strong, nonatomic) AVPlayer *player;
@property (strong, nonatomic) AVPlayerLayer *playerLayer;
@end
@implementation MapViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
GMSCameraPosition *camera = [GMSCameraPosition cameraWithLatitude:51.5 longitude:-0.127 zoom:18];
self.mapView.camera = camera;
self.mapView.delegate = self;
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
_london = [GMSMarker markerWithPosition:position];
_london.title = @"London";
_london.tracksViewChanges = YES;
_london.map = self.mapView;
[self setUpVideoPlayer];
}
- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker {
[self.player play];
return self.pinView;
}
-(void)setUpVideoPlayer{
NSString *videoFilePath = [[NSBundle mainBundle] pathForResource:@"SampleVideo" ofType:@"mp4"];
AVAsset *avAsset = [AVAsset assetWithURL:[NSURL fileURLWithPath:videoFilePath]];
AVPlayerItem *avPlayerItem =[[AVPlayerItem alloc]initWithAsset:avAsset];
self.player = [[AVPlayer alloc]initWithPlayerItem:avPlayerItem];
self.playerLayer =[AVPlayerLayer playerLayerWithPlayer:self.player];
[self.playerLayer setFrame:self.pinView.frame];
[self.pinView.layer addSublayer:self.playerLayer];
[self.player seekToTime:kCMTimeZero];
}
请帮我解决问题。为什么视频没有播放。
提前致谢。
答案 0 :(得分:1)
我相信您的代码无法正常工作的原因是 Google Maps for iOS将自定义信息视图呈现为图片。我不确定,但我相信,因为我也尝试过动画,但它也不起作用。当我使用动画时,我首先看到动画的初始状态,当我再次打开标记信息窗口时,我看到最终状态,没有动画。此外,当我在自定义信息窗口视图上添加文本字段时,我无法单击该文本字段。当我尝试像你这样的视频时,我看到一个空白的窗口,就像播放器将要开始并听到声音,但视频永远不会启动。
我在Stackoverflow的许多问题上找到了这个说明(他们说这是来自Google Docs),但我在Google文档中看不到它:
注意:每次在地图上显示信息窗口时,信息窗口都会呈现为图像。这意味着,当其属性处于活动状态时,对其属性的任何更改都不会立即可见。信息窗口的内容将在下次显示时刷新。
来源:Google Maps Showing speech bubble in marker info window iOS
也许您可以尝试使用tracksInfoWindowChanges = YES:
- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker {
marker.tracksInfoWindowChanges = YES;
self.player play];
return self.pinView;
}
来源:How to force refresh contents of the markerInfoWindow in Google Maps iOS SDK
我知道您已在viewDidLoad
方法中设置了它,但可能将其设置为
- (UIView *)mapView:(GMSMapView *)mapView markerInfoWindow:(GMSMarker *)marker
方法可能会奏效,但我不相信。很多人说将markerInfoWindow
设置为YES有效,但我已经尝试了,但它没有用。
我试图使用iOS地图和视频播放没有问题。我从未遇到过使用Apple Maps的问题。所以,我确信谷歌地图不是解决这个问题的好方法。也许你可以通过一些黑客来修复它,但我已经失去了几个小时来找到解决方案,没有结果。也许可以做到,例如,当用户在地图上移动手指或放大/缩小或其他解决方案时,将UIView移动到地图上方,但我更喜欢黑客上面的系统解决方案。在这种情况下,我没有看到系统解决方案,如果我花更多时间研究,也许我会找到它。如果我是你,我就不会使用Google地图了。
修改:我刚刚看到我的解决方案在模拟器上运行。在真实设备(iPhone 7+)上,它不起作用,即我看到播放器控件是动画,我看到声音,但我没有看到视频。但即使它在真实设备上工作,就像在模拟器上工作一样,用户也无法播放或暂停视频,因为他只能看到定期更新的图像。
答案 1 :(得分:1)
通常,信息窗口在显示后不会重新生成(将其添加为图像)。要显示视频帧,需要在视频播放时重新生成。这意味着窗口需要自动刷新。为此,您需要为GMSMarker设置一个属性。行如下,
_london.tracksInfoWindowChanges = YES;
所以你的完整代码是
CLLocationCoordinate2D position = CLLocationCoordinate2DMake(51.5, -0.127);
_london = [GMSMarker markerWithPosition:position];
_london.title = @"London";
_london.tracksViewChanges = YES;
_london.tracksInfoWindowChanges = YES;
_london.map = self.mapView;