Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add (and/or stub out) many missing features and fix several bugs. #100

Open
wants to merge 40 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
f387ad2
Added podspec
michaelmelanson Aug 29, 2013
6401494
Use [UIImage imageNamed:] to load images.
michaelmelanson Aug 29, 2013
aeaf1d7
Set the preferences to enable offline cache and developer extras.
michaelmelanson Aug 29, 2013
b3c0078
Hack to get rid of 'drifting' caused by rounding bias in UIView autor…
michaelmelanson Sep 10, 2013
f3cd5c5
Use floats for autoresizing and round to integers for the CGLayer's f…
michaelmelanson Sep 10, 2013
bb827ea
Use floats for autoresizing and round to integers for the CGLayer's f…
michaelmelanson Sep 10, 2013
65aa344
Eliminate rounding using floorf from all autoresizing calculations.
michaelmelanson Sep 10, 2013
83de6d1
Merge branch 'issue/82'
michaelmelanson Sep 10, 2013
67a7bfe
Don’t flip geometry in UIViewAdapters.
michaelmelanson Nov 12, 2013
6498cad
Add the ability to change a UIActivityIndicatorView’s colour.
michaelmelanson Nov 12, 2013
5abeb52
Use [self class] instead of isa.
michaelmelanson Nov 12, 2013
ef2dbc9
Stub in several features that don’t make sense on OS X.
michaelmelanson Nov 12, 2013
91db1ac
Make [UIImage imageNamed:] support TIFF files.
michaelmelanson Nov 12, 2013
4cd5639
Implement drawing of UIProgressView controls.
michaelmelanson Nov 12, 2013
07e8fc5
UITextLayer: Fix the alignment of the text to the clipping rect.
michaelmelanson Nov 12, 2013
220121a
Fix a warning: Xcode thinks [anId window] returns an (NSWindow *).
michaelmelanson Nov 12, 2013
90ac5b4
Make UITextField update its text layer’s visibility.
michaelmelanson Nov 12, 2013
bd8b3d8
Hack: Always call the subview’s viewWillAppear, viewWillDisappear, etc.
michaelmelanson Nov 12, 2013
f022554
Make -[UIScreen mirrorredScreen] return a UIScreen * instead of BOOL.
michaelmelanson Nov 14, 2013
8ddbcfe
Add UIViewController {present/dismiss}ViewController… methods.
michaelmelanson Nov 14, 2013
bb7754e
Make NSIndexPath+UITableView use signed integers.
michaelmelanson Nov 15, 2013
36798e3
Make UITextField display placeholders.
michaelmelanson Nov 21, 2013
5e5388f
Fix alignment of text and placeholders in text fields to match iOS.
michaelmelanson Nov 21, 2013
d9a47e7
Keep persistent UIWebView local storage database.
michaelmelanson Nov 21, 2013
cb12404
Add UIAccessibilityIsGuidedAccessEnabled
Nov 22, 2013
8c68097
Make UIDevice report proper battery/power info
michaelmelanson Mar 19, 2014
42ef8fb
Add support for tab navigation mimicking the iOS Simulator behaviour.
michaelmelanson Mar 24, 2014
b70eb96
Adjust the positioning of the red spellcheck error line.
michaelmelanson Mar 24, 2014
326d778
Add support for disabling spellcheck via setAutocorrectionType.
michaelmelanson Mar 24, 2014
ebce2bb
Move UITextField+Private.h into a better location.
michaelmelanson Mar 25, 2014
4ed34a7
HACK: Disable setting the mouse cursor requested by -[UIView mouseCur…
michaelmelanson Apr 15, 2014
45490ab
Show context menu on UIWebView controls in DEBUG builds.
michaelmelanson May 13, 2014
ed5eebc
Add property to UIWebView to control whether to show context menu.
michaelmelanson May 13, 2014
297592d
add topViewController property (maps to modalViewController)
smistry-toushay Aug 19, 2014
d06029f
rename topViewController property to presentedViewController
smistry-toushay Aug 19, 2014
b468252
Replace UITextAlignment with NSTextAlignment.
michaelmelanson Feb 9, 2015
4c7d637
Fix up a bug in splash screen positioning.
michaelmelanson Feb 9, 2015
d52553a
Add stub property 'translatesAutoresizingMaskIntoConstraints'.
michaelmelanson Feb 9, 2015
cbb2d15
Fire viewWillAppear delegate method asynchronously
michaelmelanson Feb 9, 2015
018bbca
Change containerView from id to UIView*
Apr 14, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions Chameleon.podspec
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
Pod::Spec.new do |s|
s.name = "Chameleon"
s.version = "0.0.2"
s.summary = "Chameleon is a port of Apple's UIKit (and some minimal related frameworks) to Mac OS X."
s.description = "Chameleon is a port of Apple's UIKit (and some minimal related frameworks) to Mac OS X. It is meant to be as much of a drop-in replacement for the real UIKit as possible. It also adapts some iOS user interface conventions to the Mac (such as UIAlertView being represented by NSAlert) so that apps built using Chameleon have as much chance as possible of feeling at home on the desktop with relatively little porting effort."
s.homepage = "http://chameleonproject.org/"
s.author = { "Sean Heber" => "[email protected]" }
s.source = { :git => "https://github.com/michaelmelanson/Chameleon.git" }
s.license = { :type => 'Modified BSD License' }
s.platform = :osx, '10.6'
s.frameworks = 'IOKit', 'QuartzCore', 'SystemConfiguration', 'AppKit', 'Foundation', 'QTKit', 'WebKit'

s.requires_arc = false
s.compiler_flags = '-fno-objc-arc'

s.subspec 'UIKit' do |sb|
sb.source_files = 'UIKit/Classes/*.{h,m}'
sb.resources = "UIKit/Resources/*.png"
sb.header_dir = 'UIKit'
end

s.subspec 'StoreKit' do |sb|
sb.source_files = 'StoreKit/Classes/*.{h,m}'
sb.header_dir = 'StoreKit'
end

s.subspec 'AVFoundation' do |sb|
sb.source_files = 'AVFoundation/Classes/*.{h,m}'
sb.header_dir = 'AVFoundation'
end

s.subspec 'AssetsLibrary' do |sb|
sb.source_files = 'AssetsLibrary/Classes/*.{h,m}'
sb.header_dir = 'AssetsLibrary'
end

s.subspec 'MediaPlayer' do |sb|
sb.source_files = 'MediaPlayer/Classes/*.{h,m}'
sb.header_dir = 'MediaPlayer'
end

s.subspec 'MessageUI' do |sb|
sb.source_files = 'MessageUI/*.{h,m}', 'MessageUI/Classes/*.{h,m}'
sb.header_dir = 'MessageUI'
end
end
6 changes: 3 additions & 3 deletions UIKit/Classes/NSIndexPath+UITableView.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
#import <Foundation/Foundation.h>

@interface NSIndexPath (UITableView)
+ (NSIndexPath *)indexPathForRow:(NSUInteger)row inSection:(NSUInteger)section;
@property (readonly) NSUInteger row;
@property (readonly) NSUInteger section;
+ (NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section;
@property (readonly) NSInteger row;
@property (readonly) NSInteger section;
@end
8 changes: 4 additions & 4 deletions UIKit/Classes/NSIndexPath+UITableView.m
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,18 @@

@implementation NSIndexPath (UITableView)

+ (NSIndexPath *)indexPathForRow:(NSUInteger)row inSection:(NSUInteger)section
+ (NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section
{
NSUInteger path[2] = {section, row};
NSInteger path[2] = {section, row};
return [self indexPathWithIndexes:path length:2];
}

- (NSUInteger)row
- (NSInteger)row
{
return [self indexAtPosition:1];
}

-(NSUInteger)section
-(NSInteger)section
{
return [self indexAtPosition:0];
}
Expand Down
1 change: 1 addition & 0 deletions UIKit/Classes/UIAccessibility.h
Original file line number Diff line number Diff line change
Expand Up @@ -77,4 +77,5 @@ extern UIAccessibilityNotifications UIAccessibilityPageScrolledNotification;
@end

extern void UIAccessibilityPostNotification(UIAccessibilityNotifications notification, id argument);
extern BOOL UIAccessibilityIsGuidedAccessEnabled(void);
extern BOOL UIAccessibilityIsVoiceOverRunning(void);
6 changes: 6 additions & 0 deletions UIKit/Classes/UIAccessibility.m
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,12 @@ void UIAccessibilityPostNotification(UIAccessibilityNotifications notification,
{
}


BOOL UIAccessibilityIsGuidedAccessEnabled()
{
return NO;
}

BOOL UIAccessibilityIsVoiceOverRunning()
{
return NO;
Expand Down
2 changes: 1 addition & 1 deletion UIKit/Classes/UIAction.m
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ - (BOOL)isEqual:(id)object
{
if (object == self) {
return YES;
} else if ([object isKindOfClass:[isa class]]) {
} else if ([object isKindOfClass:[self class]]) {
return ([object target] == self.target && [object action] == self.action);
} else {
return NO;
Expand Down
2 changes: 1 addition & 1 deletion UIKit/Classes/UIActivityIndicatorView.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,5 +49,5 @@ typedef enum {

@property BOOL hidesWhenStopped;
@property UIActivityIndicatorViewStyle activityIndicatorViewStyle;

@property (retain) UIColor *color;
@end
8 changes: 3 additions & 5 deletions UIKit/Classes/UIActivityIndicatorView.m
Original file line number Diff line number Diff line change
Expand Up @@ -45,15 +45,13 @@ static CGSize UIActivityIndicatorViewStyleSize(UIActivityIndicatorViewStyle styl
}
}

static UIImage *UIActivityIndicatorViewFrameImage(UIActivityIndicatorViewStyle style, NSInteger frame, NSInteger numberOfFrames, CGFloat scale)
static UIImage *UIActivityIndicatorViewFrameImage(UIActivityIndicatorViewStyle style, NSInteger frame, NSInteger numberOfFrames, CGFloat scale, UIColor *toothColor)
{
const CGSize frameSize = UIActivityIndicatorViewStyleSize(style);
const CGFloat radius = frameSize.width / 2.f;
const CGFloat TWOPI = M_PI * 2.f;
const CGFloat numberOfTeeth = 12;
const CGFloat toothWidth = (style == UIActivityIndicatorViewStyleWhiteLarge)? 3.5 : 2;

UIColor *toothColor = (style == UIActivityIndicatorViewStyleGray)? [UIColor grayColor] : [UIColor whiteColor];

UIGraphicsBeginImageContextWithOptions(frameSize, NO, scale);
CGContextRef c = UIGraphicsGetCurrentContext();
Expand Down Expand Up @@ -176,7 +174,7 @@ - (void)_startAnimation
NSMutableArray *images = [[NSMutableArray alloc] initWithCapacity:numberOfFrames];

for (NSInteger frameNumber=0; frameNumber<numberOfFrames; frameNumber++) {
[images addObject:(__bridge id)UIActivityIndicatorViewFrameImage(_activityIndicatorViewStyle, frameNumber, numberOfFrames, self.contentScaleFactor).CGImage];
[images addObject:(__bridge id)UIActivityIndicatorViewFrameImage(_activityIndicatorViewStyle, frameNumber, numberOfFrames, self.contentScaleFactor, self.color).CGImage];
}

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];
Expand Down Expand Up @@ -237,7 +235,7 @@ - (void)drawRect:(CGRect)rect
style = _activityIndicatorViewStyle;
}

[UIActivityIndicatorViewFrameImage(style, 0, 1, self.contentScaleFactor) drawInRect:self.bounds];
[UIActivityIndicatorViewFrameImage(style, 0, 1, self.contentScaleFactor, self.color) drawInRect:self.bounds];
}

@end
17 changes: 16 additions & 1 deletion UIKit/Classes/UIApplication.h
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,21 @@ typedef enum {
UIInterfaceOrientationLandscapeRight = UIDeviceOrientationLandscapeLeft
} UIInterfaceOrientation;

typedef enum : NSUInteger {
UIInterfaceOrientationMaskPortrait = (1 << UIInterfaceOrientationPortrait),
UIInterfaceOrientationMaskLandscapeLeft = (1 << UIInterfaceOrientationLandscapeLeft),
UIInterfaceOrientationMaskLandscapeRight = (1 << UIInterfaceOrientationLandscapeRight),
UIInterfaceOrientationMaskPortraitUpsideDown = (1 << UIInterfaceOrientationPortraitUpsideDown),
UIInterfaceOrientationMaskLandscape =
(UIInterfaceOrientationMaskLandscapeLeft | UIInterfaceOrientationMaskLandscapeRight),
UIInterfaceOrientationMaskAll =
(UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |
UIInterfaceOrientationMaskLandscapeRight | UIInterfaceOrientationMaskPortraitUpsideDown),
UIInterfaceOrientationMaskAllButUpsideDown =
(UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskLandscapeLeft |
UIInterfaceOrientationMaskLandscapeRight),
} UIInterfaceOrientationMask;

#define UIInterfaceOrientationIsPortrait(orientation) \
((orientation) == UIInterfaceOrientationPortrait || \
(orientation) == UIInterfaceOrientationPortraitUpsideDown)
Expand Down Expand Up @@ -153,7 +168,7 @@ extern const NSTimeInterval UIMinimumKeepAliveTimeout;

@property (nonatomic, readonly) UIWindow *keyWindow;
@property (nonatomic, readonly) NSArray *windows;
@property (nonatomic, getter=isStatusBarHidden, readonly) BOOL statusBarHidden;
@property (nonatomic, getter=isStatusBarHidden) BOOL statusBarHidden;
@property (nonatomic, readonly) CGRect statusBarFrame;
@property (nonatomic, getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible; // does nothing, always returns NO
@property (nonatomic) UIInterfaceOrientation statusBarOrientation;
Expand Down
59 changes: 59 additions & 0 deletions UIKit/Classes/UIApplication.m
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@
#import "UIKey+UIPrivate.h"
#import "UIBackgroundTask.h"
#import <Cocoa/Cocoa.h>
#import "UITextLayer.h"
#import "UITextLayer+Private.h"
#import "UITextField.h"
#import "UITextField+Private.h"


NSString *const UIApplicationWillChangeStatusBarOrientationNotification = @"UIApplicationWillChangeStatusBarOrientationNotification";
NSString *const UIApplicationDidChangeStatusBarOrientationNotification = @"UIApplicationDidChangeStatusBarOrientationNotification";
Expand Down Expand Up @@ -183,6 +188,11 @@ - (BOOL)isStatusBarHidden
return YES;
}

- (void)setStatusBarHidden:(BOOL)statusBarHidden
{
// do nothing
}

- (CGRect)statusBarFrame
{
return CGRectZero;
Expand Down Expand Up @@ -606,6 +616,55 @@ - (BOOL)_sendGlobalKeyboardNSEvent:(NSEvent *)theNSEvent fromScreen:(UIScreen *)
return [self _sendActionToFirstResponder:@selector(commit:) withSender:key fromScreen:theScreen];
}
}

if (key.type == UIKeyTypeTab) {
UIResponder *firstResponder = [self _firstResponderForScreen:theScreen];

// the open list for an interative depth-first traversal
NSMutableArray *open = [NSMutableArray array];
[open addObjectsFromArray:self.keyWindow.subviews];

NSMutableArray *allTextFields = [NSMutableArray array];

while(open.count > 0)
{
UIView *view = [open objectAtIndex:0];
[open removeObjectAtIndex:0];
[open addObjectsFromArray:view.subviews];

if ([view isKindOfClass:[UITextField class]]) {
if ([[(UITextField *)view textLayer] textShouldBeginEditing:nil]) {
[allTextFields addObject:view];
}
}
}

if ([allTextFields count] > 0) {
[allTextFields sortUsingComparator:^NSComparisonResult(id fieldOne, id fieldTwo) {
NSRect fieldOneBounds = [(UITextField *)fieldOne bounds];
NSRect fieldTwoBounds = [(UITextField *)fieldTwo bounds];

NSComparator comparator = ^(NSNumber *obj1, NSNumber *obj2) {
if ([obj1 intValue] == [obj2 intValue]) return NSOrderedSame;
else if ([obj1 intValue] < [obj2 intValue]) return NSOrderedAscending;
else return NSOrderedDescending;
};

NSComparisonResult horizontalComparison = comparator(@(fieldOneBounds.origin.x), @(fieldTwoBounds.origin.x));
NSComparisonResult verticalComparison = comparator(@(fieldOneBounds.origin.y), @(fieldTwoBounds.origin.y));

return horizontalComparison == NSOrderedSame ? verticalComparison : horizontalComparison;
}];

int currentIndex = [allTextFields containsObject:firstResponder] ? (int) [allTextFields indexOfObject:firstResponder] : -1;
int nextIndex = (currentIndex + 1) % [allTextFields count];

UIResponder *nextResponder = [allTextFields objectAtIndex:nextIndex];
[nextResponder becomeFirstResponder];
}

return YES;
}
}

return NO;
Expand Down
2 changes: 1 addition & 1 deletion UIKit/Classes/UIButton.m
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ - (id)initWithFrame:(CGRect)frame
self.opaque = NO;
_titleLabel.lineBreakMode = UILineBreakModeMiddleTruncation;
_titleLabel.backgroundColor = [UIColor clearColor];
_titleLabel.textAlignment = UITextAlignmentLeft;
_titleLabel.textAlignment = NSLeftTextAlignment;
_titleLabel.shadowOffset = CGSizeZero;
[self addSubview:_backgroundImageView];
[self addSubview:_imageView];
Expand Down
3 changes: 3 additions & 0 deletions UIKit/Classes/UICustomNSTextView.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
*/

#import <AppKit/NSTextView.h>
#import "UITextInputTraits.h"

@class CALayer, UICustomNSTextView;

Expand All @@ -40,10 +41,12 @@
@interface UICustomNSTextView: NSTextView {
BOOL secureTextEntry;
BOOL isBecomingFirstResponder;
UITextAutocorrectionType autocorrectionType;
}

- (id)initWithFrame:(NSRect)frame secureTextEntry:(BOOL)isSecure isField:(BOOL)isField;
- (void)setSecureTextEntry:(BOOL)isSecure;
- (void)setAutocorrectionType:(UITextAutocorrectionType)type;

- (BOOL)reallyBecomeFirstResponder;
- (BOOL)reallyResignFirstResponder;
Expand Down
21 changes: 19 additions & 2 deletions UIKit/Classes/UICustomNSTextView.m
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@

#import "UICustomNSTextView.h"
#import "UIBulletGlyphGenerator.h"
#import "UITextInputTraits.h"
#import <AppKit/NSLayoutManager.h>
#import <AppKit/NSTextContainer.h>
#import <AppKit/NSMenuItem.h>
Expand Down Expand Up @@ -82,6 +83,7 @@ - (id)initWithFrame:(NSRect)frame secureTextEntry:(BOOL)isSecure isField:(BOOL)i
[self setDisplaysLinkToolTips:NO];
[self setAutomaticDataDetectionEnabled:NO];
[self setSecureTextEntry:isSecure];
[self setAutocorrectionType:UITextAutocorrectionTypeDefault];

[self setLayerContentsPlacement:NSViewLayerContentsPlacementTopLeft];

Expand Down Expand Up @@ -121,16 +123,29 @@ - (void)updateStyles
[style setLineBreakMode:NSLineBreakByTruncatingTail];
}

// eliminate the built-in padding around the text field
[[self textContainer] setLineFragmentPadding:0];

[self setDefaultParagraphStyle:style];
[style release];
}

// vertically centre the text
- (NSPoint)textContainerOrigin {
return NSMakePoint(0, (self.font.ascender + self.font.descender + self.font.xHeight)/2);
}

- (void)setSecureTextEntry:(BOOL)isSecure
{
secureTextEntry = isSecure;
[self updateStyles];
}

- (void)setAutocorrectionType:(UITextAutocorrectionType)type
{
autocorrectionType = type;
}

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
{
if (secureTextEntry && ([menuItem action] == @selector(copy:) || [menuItem action] == @selector(cut:))) {
Expand Down Expand Up @@ -267,7 +282,7 @@ - (void)keyDown:(NSEvent *)event

- (void)setNeedsFakeSpellCheck
{
if ([self isContinuousSpellCheckingEnabled]) {
if ([self isContinuousSpellCheckingEnabled] && self->autocorrectionType != UITextAutocorrectionTypeNo) {
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(forcedSpellCheck) object:nil];
[self performSelector:@selector(forcedSpellCheck) withObject:nil afterDelay:0.5];
}
Expand Down Expand Up @@ -326,7 +341,9 @@ - (void)drawFakeSpellingUnderlinesInRect:(NSRect)rect

for (NSUInteger i=0; i<count; i++) {
if (NSIntersectsRect(rects[i], rect)) {
[underlinePath moveToPoint:NSMakePoint(rects[i].origin.x, rects[i].origin.y+rects[i].size.height-1.5)];
// XXX: This uses a magic number. Where does this
// constant come from?
[underlinePath moveToPoint:NSMakePoint(rects[i].origin.x, rects[i].origin.y+rects[i].size.height+5.5)];
[underlinePath relativeLineToPoint:NSMakePoint(rects[i].size.width,0)];
}
}
Expand Down
10 changes: 10 additions & 0 deletions UIKit/Classes/UIDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,13 @@ typedef enum {
UIUserInterfaceIdiomDesktop,
} UIUserInterfaceIdiom;

typedef enum {
UIDeviceBatteryStateUnknown,
UIDeviceBatteryStateUnplugged,
UIDeviceBatteryStateCharging,
UIDeviceBatteryStateFull,
} UIDeviceBatteryState;

#define UI_USER_INTERFACE_IDIOM() \
([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? \
[[UIDevice currentDevice] userInterfaceIdiom] : \
Expand All @@ -68,11 +75,14 @@ typedef enum {
@property (nonatomic, readonly, retain) NSString *name;
@property (nonatomic, readonly) UIUserInterfaceIdiom userInterfaceIdiom; // always returns UIUserInterfaceIdiomDesktop
@property (nonatomic, readonly) UIDeviceOrientation orientation; // always returns UIDeviceOrientationPortrait
@property (nonatomic, readonly) UIDeviceBatteryState batteryState; // always returns UIDeviceBatteryStateUnknown
@property (nonatomic, readonly) float batteryLevel; // always returns -1.0 (unknown)
@property (nonatomic, readonly,getter=isMultitaskingSupported) BOOL multitaskingSupported; // always returns YES
@property (nonatomic, readonly, retain) NSString *systemName;
@property (nonatomic, readonly, retain) NSString *systemVersion;
@property (nonatomic, readonly, retain) NSString *model;
@property (nonatomic, readonly, getter=isGeneratingDeviceOrientationNotifications) BOOL generatesDeviceOrientationNotifications; // aways returns NO
@property (nonatomic, assign) BOOL batteryMonitoringEnabled;

- (void)beginGeneratingDeviceOrientationNotifications; // no effect
- (void)endGeneratingDeviceOrientationNotifications; // no effect
Expand Down
Loading