UIView - iPhone Development Wiki

来源:互联网 发布:游戏脚本python 编辑:程序博客网 时间:2024/06/05 14:42

http://www.iphonedevwiki.net/index.php/UIView


UIView

UIView is the root class of all UI elements.

Contents

 [hide] 
  • 1 Getting View Hierarchy Info
    • 1.1 -recursiveDescription
    • 1.2 -scriptingInfoWithChildren
  • 2 Animation Blocks
  • 3 frame and bounds
  • 4 References

Getting View Hierarchy Info

There are 2 ways of getting the view hierarchy info, the "human readable" -[UIView recursiveDescription] and "machine readable" -[UIView scriptingInfoWithChildren].

-recursiveDescription

Signature-(NSString*)recursiveDescription;Available in3.0 –

Returns the description of the view and its subviews.

Example output:

<UIWebView: 0x4116bb0; frame = (0 100; 320 230); layer = <CALayer: 0x4116c20>>   <UIScroller: 0x411e110; frame = (0 0; 320 230); clipsToBounds = YES; autoresize = H; layer = <CALayer: 0x411e4d0>>       <UIImageView: 0x411f460; frame = (0 0; 54 54); transform = [-1, 0, -0, -1, 0, 0]; alpha = 0; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x411f490>>       <UIWebDocumentView: 0x4812c00; frame = (0 0; 320 230); layer = <UIWebLayer: 0x41171c0>>

-scriptingInfoWithChildren

Signature-(NSDictionary*)scriptingInfoWithChildren;Available in2.0 –

This function returns an NSDictionary with contains some information e.g. geometry, class name, etc.

Animation Blocks

Animation blocks are implemented by the UIViewAnimationState class with the following correspondences:

UIView methodsEquivalent call[UIView beginAnimations:identifier context:context];[UIViewAnimationState pushViewAnimationState:identifier context:context];[UIView commitAnimations];[UIViewAnimationState popAnimationState];[UIView setAnimationStartDate:date];__currentViewAnimationState->_start = [datetimeIntervalSinceReferenceDate];[UIView setAnimationsEnabled:enabled];__animate = enabled;[UIView setAnimationDelegate:delegate];if (__currentViewAnimationState->_delegate != delegate) {
  [__currentViewAnimationState->_delegate release];
  __currentViewAnimationState->_delegate = [
delegate retain];
}
[UIView setAnimationWillStartSelector:selector];__currentViewAnimationState->_willStartSelector = selector;[UIView setAnimationDidStopSelector:selector];__currentViewAnimationState->_didEndSelector = selector;[UIView setAnimationDuration:duration];__currentViewAnimationState->_duration = duration;[UIView setAnimationDelay:delay];__currentViewAnimationState->_delay = delay;[UIView setAnimationCurve:curve];__currentViewAnimationState->_curve = curve;[UIView setAnimationRepeatCount:repeatCount];__currentViewAnimationState->_repeatCount = repeatCount;[UIView setAnimationRepeatAutoreverses:autoreverses];__currentViewAnimationState->_autoreverses = autoreverses;[UIView setAnimationBeginsFromCurrentState:value];__currentViewAnimationState->_useCurrentLayerState = value;[UIView setAnimationTransition:transVal forView:containercache:cache];__currentViewAnimationState->_transition = transVal;
__currentViewAnimationState->_transitionView = [
container retain];
__currentViewAnimationState->_cacheTransition = 
cache;[UIView areAnimationsEnabled];__animate;

In above, __currentViewAnimationState is a global variable, which is a UIViewAnimationState. This value is automatically updated after calling+pushViewAnimationState:context: and +popAnimationState. NULL checks were omitted in the above codes for simplicity.

There are also a few undocumented methods:

UIView methodEquivalent call[UIView beginAnimations:identifier];[UIView beginAnimations:identifier context:NULL];[UIView setAnimationPosition:position];__currentViewAnimationState->_position = position;[UIView disableAnimation];__animate = NO;[UIView enableAnimation];__animate = YES;[UIView setAnimationFrameInterval:interval];__currentViewAnimationState->_frameInterval = interval;[UIView setAnimationStartTime:time];__currentViewAnimationState->_start = time;[UIView setAnimationRoundsToInteger:rounds];__currentViewAnimationState->_roundsToInteger = rounds;[UIView _isInAnimationBlock];[1]__currentViewAnimationState != nil;[UIView _setAnimationAttributes:attr];[2][__currentViewAnimationState setAnimationAttributes:attr];[UIView _setAnimationFilter:filter forView:view];[2]__currentViewAnimationState->_filter = filter;
__currentViewAnimationState->_filterView = [
view retain];[UIView _setAnimationFilterValue:value];[2]__currentViewAnimationState->_filterValue = value;

There are also a few equivalent (probably deprecated) selectors:

SelectorEquivalent to+endAnimations+commitAnimations+setAnimationAutoreverses:+setAnimationRepeatAutoreverses:+setAnimationFromCurrentState:+setAnimationBeginsFromCurrentState:

frame and bounds

frame and bounds are both properties of a UIView. When the view's transform is not identity, the only difference between them is the origin of bounds is always zero.

When transform is not identity, the SDK documentation warns that frame is undefined:

Warning: If the transform property is not the identity transform, the value of this property is undefined and therefore should be ignored.”

but this is not completely true — the frame is actually the rectangle enclosing the transformed view.

These properties are actually proxies to the corresponding ones of CALayer. However, while the bounds (and center) is an internal property, frame incurs a transactional lock (spin lock) and an affine transform.

References

  1. ↑ +_isInAnimationBlock was named as +_pendingAnimations prior to 3.2
  2. ↑ 2.0 2.1 2.2 These methods are available since 3.2.
  • Official documentation: UIView
  • Header: http://github.com/kennytm/iphone-private-frameworks/blob/master/UIKit/UIView2.h

原创粉丝点击