我有一个UIView,里面有一个AVPlayer,用来播放视频.当改变方向时,我需要改变视频的大小和位置.

我对调整图层大小不是很有经验,所以我在调整视频大小时遇到了问题.

我首先创建AVPlayer并将其播放器添加到我的videoHolderView图层:

NSURL *videoURL = [NSURL fileURLWithPath:videoPath];
self.avPlayer = [AVPlayer playerWithURL:videoURL];

AVPlayerLayer* playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.avPlayer];
playerLayer.frame = videoHolderView.bounds;
playerLayer.videoGravity = AVLayerVideoGravityResizeAspect;
playerLayer.needsDisplayOnBoundsChange = YES;

[videoHolderView.layer addSublayer:playerLayer];
videoHolderView.layer.needsDisplayOnBoundsChange = YES;

然后,在稍后,我更改videoHolderView帧的大小和位置:

[videoHolderView setFrame:CGRectMake(0, 0, 768, 502)];

在这一点上,我需要的avPlayer调整到这些相同的尺寸.这并不是自动发生的——avPlayer在videoHolderView中保持较小的尺寸.

如果有人能帮忙,我真的很感激任何建议.

谢谢大家.

推荐答案

将@Suran的解决方案转换为Swift:

首先,创建一个继承UIView的类,其中只覆盖1个变量:

import UIKit
import AVFoundation

class AVPlayerView: UIView {
    override class var layerClass: AnyClass {
        return AVPlayerLayer.self
    }
}

然后使用interface builder添加一个简单的UIView,并将其类更改为刚刚创建的类:AVPlayerView

change class of regular UIView to AVPlayerView

然后,为这种观点制造一个出口.叫它avPlayerView

@IBOutlet weak var avPlayerView: AVPlayerView!

现在,您可以在viewcontroller中使用该视图并访问其avlayer,如下所示:

let avPlayer = AVPlayer(url: video)
let castLayer = avPlayerView.layer as! AVPlayerLayer
castLayer.player = avPlayer
avPlayer.play()

该层现在将像普通层一样遵循约束.无需手动更改边界或大小.

Objective-c相关问答推荐

NSNumberFormatter 和 'th' 'st' 'nd' 'rd' (序数)数字结尾

Objective C 中的多个委托

自动布局和按下时隐藏底栏

如何在 iOS SDK 中使用语音识别?

使用 NSMutableArray 的二维数组

如何调整 UIModalPresentationFormSheet 的大小?

MKMapView MKPointAnnotation 点击​​事件

失go 对 UITextView 的关注时隐藏键盘

在我的 iOS Mail 和 Safari 应用程序中支持 Open In... 菜单项

arc4random 和 arc4random_uniform 有什么区别?

获取字符串的最后 2 个字符?

使用 NSLog 打印 NSData

遍历 NSString 中所有字符的最有效方法

在 Objective-C 中_和touch之间的区别

为什么 LLDB 不能打印 view.bounds?

最大 CGFloat 值是否有常数?

如何将 tintColor 应用于 UIImage?

如何更新 Core Data 中的现有对象?

如何将按钮放在不会在 iOS 中随表格滚动的 UITableView 上

无法更改 UILabel 文本 colored颜色