我有这个应用程序,我正在努力,我需要所有的视图控制器,但一个是肖像.单一的视图控制器是特殊的我需要它能够旋转到手机的任何方向.
为此,我以模态方式呈现它(未嵌入NavigationController中)
所以(例如)我的结构是这样的:
现在,当我在横向位置解除模态视图控制器时,我的父视图控制器也会旋转,即使它不支持该方向.
应用程序中的所有UIViewControllers和UINavigaionControllers继承自实现这些方法的相同通用类:
override func supportedInterfaceOrientations() -> Int
{
return Int(UIInterfaceOrientationMask.Portrait.toRaw())
}
Run Code Online (Sandbox Code Playgroud)
我的模态视图控制器再次覆盖此方法,它看起来像这样:
override func supportedInterfaceOrientations() -> Int
{
return Int(UIInterfaceOrientationMask.All.toRaw())
}
Run Code Online (Sandbox Code Playgroud)
更新1
看起来这只发生在iOS8 Beta上.有人知道视图控制器的轮换是否有变化,或者这只是测试版中的错误?
所以我对我正在构建的应用程序存在这个问题,我无法弄清楚.我的应用程序具有以下结构:
UITabBarController - > UIViewController - > UIViewController
最后一个视图控制器包含一个UIWebView,它加载整个页面.在该页面中有一部电影(mp4),用户可以在点击大圆形播放按钮后播放.
该应用程序使其以纵向模式运行,并且由于其初始设计,我无法以其他方式运行它.
我想要实现的是让用户在电影开始播放后旋转手机并相应地旋转电影.我通过收听NSNotificationsCenter发送的不同NSNotifications来播放电影时设法"检测".
我用它来检测开始:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieIsPlaying:)
name:@"UIMoviePlayerControllerDidEnterFullscreenNotification"
object:nil];
Run Code Online (Sandbox Code Playgroud)
这用于检测结束:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(movieStopedPlaying:)
name:@"UIMoviePlayerControllerDidExitFullscreenNotification"
object:nil];
Run Code Online (Sandbox Code Playgroud)
现在使用2个选择器,我将一个全局变量设置为YES或NO,我稍后可以使用它
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
Run Code Online (Sandbox Code Playgroud)
如果我总是从上面的方法返回YES,我的应用程序界面会在everyscreen上旋转,除非电影启动并运行.最奇怪的是:
此外,如果我以纵向模式启动电影,它将永远不会旋转.
所以,如果你能以某种方式帮助我,请各位让我知道.我真的很绝望.如果您需要更多信息,请告诉我.
谢谢!
更新
最后,我为上述两种方法提出了这个解决方案:
- (void)movieIsPlaying:(NSNotification *)notification
{
if (![Globals canRotateInterface]) {
[Globals setCanRotateInterface:YES];
[[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight animated:NO];
[[[[notification object] view] window] setBounds:CGRectMake(0, 0, 480, 320)];
[[[[notification object] view] window] setCenter:CGPointMake(160, 240)];
[[[[notification object] view] window] setTransform:CGAffineTransformMakeRotation(M_PI / 2)];
}
}
- …Run Code Online (Sandbox Code Playgroud) 我知道有几个问题,但我无法弄清楚如何做到这一点(没有帮助我的答案),所以这是我的问题版本.
我有一个UICollectionView设置为水平滚动.每个细胞都有一个UIScrollView内部和内部UIScrollView我有一个UIImageView.
现在,显示的图像UIImageView是从互联网上加载的,我无法找到一种方法来使用故事板和自动布局正确地进行缩放工作.
如果我设置将我UIScrollView的容器绑定到容器的约束,一切都可以.我UIImageView 与UIScrollViewXCode 绑定的那一刻开始抱怨它UIScrollView的大小是模棱两可的.
如果我在InterfaceBuilder中没有做任何约束,那么图像不会以正确的大小显示(doh!).
所以,我被困住了.我不知道要制定什么样的约束以及哪种观点需要与什么相关联.我知道我的完美世界结果是一个视图控制器,其行为类似于原生iOS照片应用程序.也就是说,图像显示为与屏幕一样大(根据图像的方向在顶部和底部或左右两侧带有黑色条带),您可以将其放大并平移.
请帮忙!
注意
在发布我自己的问题之前,我确实阅读了这些帖子
我知道之前曾问过这个问题(例如这里和这里),但我无法弄清楚我做错了什么.
我有一个AVMutableComposition用于将一些视频剪辑与一些CALayer动画组合在一起的视频剪辑.
当我AVMutableComposition把它和它结合在一起AVSynchronizedLayer进行播放时,一切正常AVPlayerLayer.视频输出正确,一切都放在应有的位置.
我的问题是,当我尝试导出这个东西时,我尝试使用AVVideoCompositionCoreAnimationTool而不是AVSynchronizedLayer(这是文档中我们应该用于导出的东西)和AVAssetExportSession,但是出了点问题,因为在我导出的电影中,每个CALayer都有它的坐标系反转.
所以,如果在播放过程中0,0点是在左上角的屏幕一角时,我出口的电影的0,0点是在左下方的角落,因此我的动画发疯.
我阅读了有关此内容的任何可能的文章,我还从Apple下载了AVVideoEdit示例,但我无法看到发生了什么......
iphone core-animation avfoundation avmutablecomposition avassetexportsession
在我的故事板中,我有一个View Controller,我还有一个导航控制器和另一个名为HistoryController的View Controller.导航控制器和HistroyController有一个关系"根视图控制器"
我的第一个视图控制器上有一个按钮,该按钮有一个推送到导航控制器的按钮.
我在第一个视图控制器中有这个代码来准备segue:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let viewController = segue.destination as? HistoryController {
viewController.detailItem = barcodeInt as AnyObject
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是当我运行我的代码并按下我的第一个控制器中的按钮时,我收到此错误:
Could not find a navigation controller for segue 'HistorySegue'. Push segues can only be used when the source controller is managed by an instance of UINavigationController.'
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么我会收到此错误,我该如何解决?
我尝试了以下内容
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let navVC = segue.destinationViewController as? UINavigationController{
if let historyVC = navVC.viewControllers[0] as? HistoryController{
historyVC.detailItem …Run Code Online (Sandbox Code Playgroud) 最终更新 - 修正
我修好了.看来尽管玩弄(这是我在斯威夫特的第一个项目,并使用自动版式)我已经改变了contentCompressionResistancePriority和contentHuggingPriority对我的一些看法.取出该代码并将我的所有视图重置为IB中的默认值修复了我的问题.
初始帖子
所以我在iOS上使用AutoLayout来定位我的动态视图.在我弹出一个视图控制器之前,这一切都很好用.该应用程序崩溃了一个非常有用的错误消息,如下所示:
...
internal error. Cannot find an outgoing row head for incoming head UIImageView:0xd049d50.Width{id: 730}, which should never happen.'
...
Run Code Online (Sandbox Code Playgroud)
我一直在瞎逛,搜索网络,但我无法修复它.我发现虽然我的代码中有一行可以有所作为.在我说的视图控制器中,我有一堆UIImageViews正在使用AutoLayout以及我从网上加载的图像.
如果不是将我收到的图像设置给他们,我在Swift中设置一个空的([[UIImage alloc] init]或者UIImage()),就像我的情况一样)它不会再崩溃了.
我甚至尝试从应用程序包中设置一个虚拟图像,但这也使它崩溃了.
我们欢迎所有的建议!
更新1
通过再次查看代码,我还发现存在一个与那些UIImageViews也会使崩溃在消除时消失的约束.它是宽高比约束,看起来像这样
imageView.addConstraint(NSLayoutConstraint(item: imageView, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: imageView, attribute: NSLayoutAttribute.Height, multiplier: 8.0 / 5.0, constant: 0.0))
Run Code Online (Sandbox Code Playgroud)
难道我做错了什么?我真的需要满足这个宽高比,所以我不能真正删除它
更新2
再多说一点,我想办法让它发挥作用.但是我对此并不满意,因为它并没有让我明白发生了什么,这是一种黑客攻击
让我为您构建我的视图结构:
这些视图的放置方式如下:
Cover ImageView的宽度ContentView …更新 - 我已经为回答这个问题增加了50个声望奖励!
我有一个应用程序,需要将一些视频和照片放在一起,以创建一个电影.我正在使用AVMutableComposition.为了能够指导视频如何组合,我必须使用AVMutableVideoComposition.这个东西有一个名为的属性backgroundColor,Apple Documentation说:
仅支持纯色BGRA颜色; 模式和其他支持的颜色将被忽略.如果渲染的像素缓冲区没有alpha,则忽略背景颜色的alpha值.
我从中理解的是,有一种方法可以将alpha通道添加到backgroundColor,但我只是不明白如何.什么If the rendered pixel buffer does not have alpha, the alpha value of the background color is ignored.意思?我怎么能添加这样的东西?
如果我这样做myVideoCompositionInstruction.backgroundColor = [[UIColor colorWithWhite:1 alpha:0] CGColor];只是不起作用 - 背景保持白色并且不透明.
任何帮助将不胜感激,谢谢!
iphone transparent background-color avfoundation avcomposition
所以我在SceneKit中有这些场景,我以编程方式创建了一堆不同高度的对象.他们中的大多数是简单的盒子,但其中一些是挤压路径.
我需要能够为它们添加一种简单的材料颜色,使颜色从较暗的值变为从底部到顶部的较浅的颜色.
我一直试图通过创建一个具有渐变图像纹理的材质来实现这一目标CAGradientLayer.这"几乎"有效.这种方法的问题是对象的所有面都会得到相同的效果,这不是我想要的.物体的顶部和底部表面应为纯色 - 顶部表面的浅色和底部的浅色.
我一直在使用着色器,但结果是一个相对于屏幕而不是我的对象的渐变,从而将我的3D对象渲染为2D.
这是我如何创建一个简单的纯色框,例如:
func createBox(with bounds: CGRect, and height: CGFloat) {
let material = SCNMaterial()
material.diffuse.contents = UIColor.white
if #available(iOS 10.0, *) {
material.lightingModel = .physicallyBased
material.metalness.contents = 0.2
material.roughness.contents = 0.5
}
let geometry = SCNBox(width: bounds.size.width, height: height, length: bounds.size.height, chamferRadius: 0.0)
geometry.materials = [material]
geometry.chamferRadius = 0.02
let node = NKNode(geometry: geometry)
}
Run Code Online (Sandbox Code Playgroud)
现在,由于一个盒子默认有6个不同的几何元素,我可以选择创建一个材料,将其内容设置为渐变图像,然后在该materials数组中添加所述材质6次geometry.这允许我单独为每个面设置材质,如下所示:
let material = SCNMaterial()
material.diffuse.contents = UIImage(named: "gradient-test")
geometry.materials = [material, …Run Code Online (Sandbox Code Playgroud) 正如maddy在下面的评论中提到的,很明显你需要一个对象的引用才能调用它的方法。这可能实际上是我的问题:您如何跟踪实现协议的所有对象?
回顾 Objective-C,我想过使用类似于+load或 的+initialize方法并将对象添加为特定NSNotification. 但这行不通,因为这些方法是类方法而不是实例方法。
所以,试着说得更具体一点:有没有一种方法可以在所有对象创建后调用它们?一种允许我将该对象添加到我管理的集合或作为特定对象的观察者的方法NSNotification?
PS:我没有尝试为问题添加太多细节,因为我不想用我糟糕的、无意义的想法“玷污”你。
所以......想象一下这段代码:
protocol MyProtocol: class {
func myMethod()
}
public class MyClass: MyProtocol {
func myMethod() {
print("myMethod called on MyClass")
}
}
extension UIView: MyProtocol {
func myMethod() {
print("myMethod called on UIView")
}
}
let myObject = MyClass()
let myView = UIView()
Run Code Online (Sandbox Code Playgroud)
现在......我试图找出一种方法来myMethod从不知道它们的第三个对象调用这两个对象 - 这是第三个对象的简化示例:
class MyManager {
func callMyMethodOnAllObjecs() {
// Do something here so that ALL …Run Code Online (Sandbox Code Playgroud) 我有一个UITableView叫做症状表...并且在可以补救的时候有可补救UISwitch我UIImage在症状表格UISwitch单元格上显示突出显示该单元格为ON.当我在第一症状的可补救措施中打开时,我正在显示,UISwitch但是细胞正在被重复使用,并且图像也在其他症状视图细胞中显示.任何人都可以帮我解决这个问题吗?
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
if (tableView==symptomsTableView)
{
PPsymptomTableCell *cell;
static NSString *cellIdentifier=@"cellIdentifier";
cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell==nil)
{
cell=[[PPsymptomTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
cell.selectionStyle=UITableViewCellSelectionStyleNone;
}
int symptomIDSelected;
symptomIDSelected = [[[mainsymptArray objectAtIndex:indexPath.row]objectForKey:@"SymptID"]intValue];
NSLog(@"%d",[[activeNotificationDictionary objectForKey:[NSNumber numberWithInt:symptomIDSelected]]intValue]);
for (int i = 0; i<activeNotificationDictionary.count; i++)
{
if([[activeNotificationDictionary objectForKey:[NSNumber numberWithInt:symptomIDSelected]]intValue] == symptomIDSelected)
{
cell.selectedCellImageDisplay.hidden=NO;
}
else
{
cell.selectedCellImageDisplay.hidden=YES;
}
}
NSLog(@"end of symptoms cell for row");
if (searching==YES)
{
cell.symptomCellLabel.text=[[searchSymptomsArray objectAtIndex:indexPath.row] objectForKey:@"SymptName"];
cell.backgroundColor=[UIColor clearColor]; …Run Code Online (Sandbox Code Playgroud) ios ×6
swift ×6
iphone ×5
objective-c ×3
autolayout ×2
avfoundation ×2
rotation ×1
scenekit ×1
swift3 ×1
transparent ×1
uiscrollview ×1
uitableview ×1
uiwebview ×1
video ×1
zoom ×1