2012-12-04 11 views
6

私はこのようなUIActionSheet示しています:senderオブジェクトはUITableViewCellのアクセサリービューに埋め込まUIButtonあるUIActionSheet showFromRectオートローテーション

-(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]; 
} 

を。

問題は、iPadが回転しているときにアクションシートがサイズ変更されていないときです(私は実際にサイズ変更するとは思っていませんが、正しいX、Yにしたいと思います)。AutoResizingMaskをFlexibleLeftとFlexibleTopに設定しようとしました。それは変化していないようです。

自動回転後にaccessoryViewを指すようにactionSheetを取得する方法はありますか?ここで

は、それがどのように見えるかです:回転した後Rotation- Before Rotation

- enter image description here

答えて

7

それはUIKitが適切に私たちのためにこれを処理しません残念です。自分のアプリケーションでは、私はビューコントローラのdidRotateFromInterfaceOrientation:メソッドを実装し、ビューの更新されたフレームを使って再びポップオーバーを再描画することによってこれを処理します。

+0

...これのいくつかはGitHubのに行く必要がありますねそうする。新しいボタンxyにアニメーションを付けるといいかもしれません。ありがとう。 – mkral

+0

'willRotateToInterfaceOrientation'はこのケースを処理するためのより良い結果を提供します。 –

0

これに対する私のソリューションは、@ rmaddy'sの一般的なバリエーションです。これは少し複雑ですが、コールバックをローテーションするための一般的な解決策が必要な場合は、これが役立ちます。私は、私が(典型的には非ビューコントローラクラス)それを必要とするクラスで

​​

:私は、私が実装している主なコンテナビューコントローラを(あなたがしたい場合、UINavigationControllerのサブクラスと考える)持っていますコールバックを登録する。以下のように、例えば、

[[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 

は[OK]を、私はそれは私が持っているよ何だと思う

関連する問題