6

我正在展示UIActionSheet这样的:

-(void)accessoryPressed:(id)sender{
    //Omitted unnecessary objects

    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:titleString delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:@"Delete" otherButtonTitles:@"Upload", nil];
    //actionSheet.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
    actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
    actionSheet.tag = ((UIButton*)sender).tag;
    [actionSheet showFromRect:[(UIButton*)sender frame] inView:[(UIButton*)sender superview] animated:YES];
}

sender对象UIButton嵌入在 a的UITableViewCell附件视图中的位置。

问题是当 iPad 旋转时,操作表没有调整大小(我不希望它实际调整大小,但我希望它位于正确的 X、Y 中)我尝试将 AutoResizingMask 设置为 FlexibleLeft 和 FlexibleTop 但它没有似乎改变了。

有没有人知道如何让 actionSheet 指向accessoryView自动旋转后?

这是它的样子:

旋转前- 旋转前

旋转后 - 在此处输入图像描述

4

2 回答 2

7

很遗憾UIKit没有为我们妥善处理这个问题。在我自己的应用程序中,我通过didRotateFromInterfaceOrientation:在视图控制器中实现该方法来处理此问题,并使用更新的视图框架再次重新显示任何弹出窗口。

于 2012-12-04T19:59:50.980 回答
0

我对此的解决方案是对@rmaddy 的广义变体。这有点复杂,但如果您想要一个通用的解决方案来获取轮换回调,这可能会有所帮助。我有一个主容器视图控制器(如果需要,可以将其视为 UINavigationController 的子类),我在其中实现:

- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;
{
    [[SMRotation session] viewControllerWillRotate];
}

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation;
{
    [[SMRotation session] viewControllerDidRotate];
}

在我需要它的类(通常是非视图控制器类)中,我注册了回调。例如,

[[SMRotation session].willRotate addTarget:popTip withSelector:@selector(willRotateHelp)];
[[SMRotation session].didRotate addTarget:popTip withSelector:@selector(didRotateHelp)];

SMRotation 类如下:

//
//  SMRotation.h
//  Petunia
//
//  Created by Christopher Prince on 5/10/15.
//  Copyright (c) 2015 Spastic Muffin, LLC. All rights reserved.
//

// The reason for this class is because I don't, in general, appear to be able to get willRotate notifications from iOS. UIDevice only seems to support didRotate notifications.

#import <Foundation/Foundation.h>
#import "NSObject+TargetsAndSelectors.h"

@interface SMRotation : NSObject

+ (instancetype) session;

// Call these back from the same named methods in your main view controller.
- (void) viewControllerWillRotate;
- (void) viewControllerDidRotate;

// Use these in other classes to get rotation callbacks. There are no parameters passed to the callbacks.
@property (nonatomic, strong, readonly) NSObject<TargetsAndSelectors> *willRotate;
@property (nonatomic, strong, readonly) NSObject<TargetsAndSelectors> *didRotate;

@end

//
//  SMRotation.m
//  Petunia
//
//  Created by Christopher Prince on 5/10/15.
//  Copyright (c) 2015 Spastic Muffin, LLC. All rights reserved.
//

#import "SMRotation.h"

@interface SMRotation()
@property (nonatomic, strong) NSObject<TargetsAndSelectors> *willRotate;
@property (nonatomic, strong) NSObject<TargetsAndSelectors> *didRotate;
@end

@implementation SMRotation

+ (instancetype) session;
{
    static SMRotation* s_sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        s_sharedInstance = [self new];
        [s_sharedInstance setup];
    });

    return s_sharedInstance;
}

- (void) setup;
{
    self.willRotate = [NSObject new];
    [self.willRotate resetTargets];
    self.didRotate = [NSObject new];
    [self.didRotate resetTargets];
}

- (void) viewControllerWillRotate;
{
    [self.willRotate forEachTargetInCallbacksDo:^(id target, SEL selector, NSMutableDictionary *dict) {
        [target performVoidReturnSelector:selector];
    }];
}

- (void) viewControllerDidRotate;
{
    [self.didRotate forEachTargetInCallbacksDo:^(id target, SEL selector, NSMutableDictionary *dict) {
        [target performVoidReturnSelector:selector];
    }];
}

@end

TargetsAndSelectors 类别如下:

//
//  NSObject+TargetsAndSelectors.h
//  Petunia
//
//  Created by Christopher Prince on 5/11/15.
//  Copyright (c) 2015 Spastic Muffin, LLC. All rights reserved.
//

#import <Foundation/Foundation.h>

// Allow an object to have a collection of target's, and selectors that can be called as needed.

@protocol TargetsAndSelectors <NSObject>

// The only reason I have made all of these optional is to avoid the compiler complaining. I'm using this protocol just to document the fact that I'm making these methods available (through the NSObject (TargetsAndSelectors) category) in a particular class.
@optional

// Clear all target/selector's. This method must be called *before* any call to addTarget or to other methods of this category, for a particular instance.
- (void) resetTargets;

/**
 *  Add/remove a callback.
 *
 *  @param target Target object.
 *  @param selector Method to call on the target object.
 *
 *  @return Dictionary that was just added to the callbacks property for this target and selector.
 */
- (NSMutableDictionary *) addTarget: (id) target withSelector: (SEL) selector;
- (void) removeTarget: (id) target withSelector: (SEL) selector;

/**
 *  Convenience method to enable calling each of the callbacks in sequence.
 */
- (void) forEachTargetInCallbacksDo: (void (^)(id target, SEL selector, NSMutableDictionary *dict)) block;

// Elements are NSMutableDictionary's, with keys:
// Value of this is a target (id) embedded in a WeakRef object, so that if the target is deallocated, we don't retain a reference that object.
#define TARGETS_KEY_WEAK_TARGET @"weakTarget"
// Value of this is formatted as an NSString
#define TARGETS_KEY_SELECTOR @"selector"
@property (nonatomic, strong, readonly) NSArray *callbacks;

@end

@interface NSObject (TargetsAndSelectors)<TargetsAndSelectors>
@end

//
//  NSObject+TargetsAndSelectors.m
//  Petunia
//
//  Created by Christopher Prince on 5/11/15.
//  Copyright (c) 2015 Spastic Muffin, LLC. All rights reserved.
//

#import "NSObject+TargetsAndSelectors.h"
#import <objc/runtime.h>
#import "WeakRef.h"

@implementation NSObject (TargetsAndSelectors)

static char kCallbacksKey;

- (void) setCallbacks:(NSArray *)callbacks
{
    objc_setAssociatedObject(self, &kCallbacksKey, callbacks, OBJC_ASSOCIATION_RETAIN);
}

- (NSArray *) callbacks
{
    NSArray *theCallbacks = (NSArray *) objc_getAssociatedObject(self, &kCallbacksKey);
    return theCallbacks;
}

- (void) resetTargets
{
    self.callbacks = [NSMutableArray new];
}

- (NSMutableArray *) mutableCallbacks
{
    NSMutableArray *mutableCallbacks = (NSMutableArray *) self.callbacks;
    return mutableCallbacks;
}

- (NSMutableDictionary *) addTarget: (id) target withSelector: (SEL) selector;
{
    WeakRef *weakTarget = [WeakRef toObj:target];

    NSMutableDictionary *dict = [@{TARGETS_KEY_WEAK_TARGET: weakTarget,
                                   TARGETS_KEY_SELECTOR: NSStringFromSelector(selector)} mutableCopy];
    [[self mutableCallbacks] addObject:dict];
    return dict;
}

- (void) removeTarget: (id) target withSelector: (SEL) selector;
{
    NSString *stringSelector = NSStringFromSelector(selector);
    NSDictionary *dictToRemove = nil;

    for (NSDictionary *dict in [self mutableCallbacks]) {
        NSString *dictSelectorString = dict[TARGETS_KEY_SELECTOR];
        WeakRef *weakTarget = dict[TARGETS_KEY_WEAK_TARGET];
        if (weakTarget.obj == target && [dictSelectorString isEqualToString:stringSelector]) {
            dictToRemove = dict;
            break;
        }
    }

    if (dictToRemove) {
        [[self mutableCallbacks] removeObject:dictToRemove];
    }
}

- (void) forEachTargetInCallbacksDo: (void (^)(id target, SEL selector, NSMutableDictionary *dict)) block;
{
    // 5/10/15; Making a copy of the callbacks array in case one of the callbacks calls removeTarget above.
    NSArray *copyOfCallbacks = [self.callbacks copy];

    for (NSMutableDictionary *dict in copyOfCallbacks) {
        NSString *dictSelectorString = dict[TARGETS_KEY_SELECTOR];
        SEL selector = NSSelectorFromString(dictSelectorString);

        WeakRef *weakTarget = dict[TARGETS_KEY_WEAK_TARGET];

        // Going to just skip by any target that is nil, i.e., has been deallocated. A better idea would be to remove that target from the array...
        if (weakTarget.obj) {
            block(weakTarget.obj, selector, dict);
        }
    }
}

@end

最后,WeakRef 是:

//
//  WeakRef.h
//  Petunia
//
//  Created by Christopher Prince on 9/1/14.
//  Copyright (c) 2014 Spastic Muffin, LLC. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface WeakRef : NSObject

+ (instancetype) toObj: (id) obj;
+ (id) from: (WeakRef *) weakRef;

@property (nonatomic, weak) id obj;

@end

//
//  WeakRef.m
//  Petunia
//
//  Created by Christopher Prince on 9/1/14.
//  Copyright (c) 2014 Spastic Muffin, LLC. All rights reserved.
//

#import "WeakRef.h"

@implementation WeakRef

+ (instancetype) toObj: (id) obj;
{
    WeakRef *result = [WeakRef new];
    result.obj = obj;
    return result;
}

+ (id) from: (WeakRef *) weakRef;
{
    return weakRef.obj;
}

@end

猜猜其中一些应该放在Github上......

于 2015-05-11T20:56:46.520 回答