如何像 iPhone 照片应用程序那样防止自动旋转?

Posted

技术标签:

【中文标题】如何像 iPhone 照片应用程序那样防止自动旋转?【英文标题】:How to prevent auto rotation like the iPhone photo app does? 【发布时间】:2014-03-19 06:56:48 【问题描述】:

我想防止 UICollectionViewController 在屏幕上有手指时自动旋转。手指可以移动,设备可以旋转,但只要手指仍在屏幕上,UICollectionViewController 就不应旋转。

当手指离开屏幕时,UICollectionViewController 应该立即旋转。就像 iPhone 照片应用一样。

问题:

    如何检测触摸?

    我覆盖了 UICollectionView 子类中的 touchBegan:withEvent: 等。但是当 UICollectionView 开始滚动时,它会调用touchCanceled:withEvent: 方法。

    如果我更早开始滚动 UICollectionView,touchBegan:withEvent: 甚至不会触发。

    如何暂时防止自动旋转?

    我在视图控制器中覆盖了shouldAutorotate 以防止旋转。但是当手指离开屏幕时,UICollectionView 不能立即旋转。

【问题讨论】:

你的意思是修复设备方向 我想在手指触摸时暂时禁用旋转。 【参考方案1】:

请试试这个代码:

@interface BlockAutorotateViewController ()

@property (nonatomic, strong) UILongPressGestureRecognizer *longPressGestureRecognizer;
@property (nonatomic, strong) UISwipeGestureRecognizer *swipeGestureRecognizer;
@property (nonatomic, assign, getter = isPressed) BOOL pressed;

@end

@implementation BlockAutorotateViewController

- (void)viewDidLoad

    [super viewDidLoad];

    self.pressed = NO;

    self.longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(myLongPressAction:)];
    self.longPressGestureRecognizer.minimumPressDuration = 0;
    [self.view addGestureRecognizer:self.longPressGestureRecognizer];

    self.swipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(mySwipeAction:)];
    [self.view addGestureRecognizer:self.swipeGestureRecognizer];



- (void)myLongPressAction:(id)sender

    if ((self.longPressGestureRecognizer.state == UIGestureRecognizerStateEnded) || (self.longPressGestureRecognizer.state == UIGestureRecognizerStateChanged))  
        self.pressed = YES;
    
    else if (self.longPressGestureRecognizer.state == UIGestureRecognizerStateBegan) 
        self.pressed = NO;
        [UIViewController attemptRotationToDeviceOrientation];
    
    else 
        self.pressed = NO;
    


- (void)mySwipeAction:(id)sender

    if ((self.swipeGestureRecognizer.state == UIGestureRecognizerStateBegan) || (self.longPressGestureRecognizer.state == UIGestureRecognizerStateChanged))  
        self.pressed = YES;
    
    else if (self.longPressGestureRecognizer.state == UIGestureRecognizerStateEnded) 
        self.pressed = NO;
        [UIViewController attemptRotationToDeviceOrientation];
    
    else 
        self.pressed = NO;
    


- (BOOL)shouldAutorotate

    return (self.isPressed ? NO : YES);


@end

【讨论】:

@smilingpoplar,你会使用哪一个来实现这个所需的功能?你测试过上面的例子吗? 我已经试过你的代码了。如果我先移动手指,然后旋转设备,它不起作用。在这种情况下,视图不应旋转。 你试过没有 UIGestureRecognizerStateChanged 在第一个 if 语句中,当然? 我试过你的新代码。你可以这样测试:快速点击并滑动视图,然后旋转设备。 不要误会我的意思,但首先你应该测试一下,对吧? :) 我正在努力帮助你。另外,花点时间研究一下手势识别器,你会更容易在建议的代码上走得更远。这个网站的目的不是获得免费的sn-ps,而是合作。我还建议你提出更明确的要求,你会在这里多次得到这个。只是一个友好的建议。【参考方案2】:

为了检测触摸事件,我建议使用 UIGestureRecognizer 而不是覆盖 UICollectionViewController 的触摸事件。这样您就可以在不干扰现有事件处理的情况下收到有关触摸事件的通知。

您可能需要两个自定义 UIGestureRecognizer 类来实现这一点,因为我认为 UITapGestureRecognizer 不能满足您的需求。您可以让一个 UIGestureRecognizer 通知您手指按下事件,另一个通知您手指抬起时。

为了防止自动旋转,请像您已经完成的那样覆盖 shouldAutorotate。当您的手势识别器检测到手指已抬起时,调用 [UIViewController attemptRotationToDeviceOrientation] 告诉 ios 将 UI 旋转到当前方向。 (显然,在调用之前,应该确保 shouldAutorotate 现在返回 YES。)

【讨论】:

您的想法可能会奏效。但它需要实现两个自定义 UIGestureRecognizer。有时间我会试试的。

以上是关于如何像 iPhone 照片应用程序那样防止自动旋转?的主要内容,如果未能解决你的问题,请参考以下文章

在ios应用程序中更改位置iPhone时如何旋转照片[关闭]

iPhone:如何防止视图旋转到横向视图?

unity 在mac 中 怎么用触控板 让界面旋转

如何根据添加到画廊的日期在 Swift 中对照片进行排序

如何从一系列照片中计算出恒星旋转?

如何在 iphone 中使用 avFoundation 像 Instagram 应用一样拍摄方形照片?