How to Center UI View when in landscape & portrait? - ios

I having trouble centering 2 UIImages and a Layer when Orientation changes.
here is what i did to center it
_colorLayer = [CALayer layer];
CGRect frame = self.hueImageView.frame;
CGSize superviewSize = self.hueImageView.superview.frame.size;
self.hueImageView.center = CGPointMake((superviewSize.width / 2), (superviewSize.height / 2));
self.checkeredView.center = CGPointMake((superviewSize.width / 2), (superviewSize.height / 2));
self.labelPreview.center = CGPointMake((superviewSize.width / 2), (superviewSize.height / 2));
this works fine in portrait. but when i rotate the images do not go to the middle .
the project is on my github
https://github.com/RK905/NewColorPic/blob/master/NewColorPic/NEOColorPickerHSLViewController.m

just set the center from your superView to all other views. superView.center should do it. No fights with height/2 and width/2 .
If you would use constraints, you will not need to set it again. Just align the views to the center.y and center.x of the superView. No fight with orientations because the constrain center will automaticly move also

Related

Swift - can't make scrollview be able to scroll left?

Im having an odd problem with a scrollview - I have tried doing this in a xib file and programmatically. Basically I 3 textfields that I want to be able to scroll to with my scrollview filling the whole screen.
To do this, I first created a scrollview on my xib and constrained it so it always filled the screen. I then expanded the contentsize to 3 times the size of the view so it should be able to scroll
scrollView.delegate = self
scrollView.frame = CGRectMake(0, 0, screenSize.width, screenSize.height)
scrollView.backgroundColor = UIColor.redColor()
self.scrollView.contentSize = CGSizeMake(self.view.frame.width*3, screenSize.height * (50/568))
scrollView.center = CGPointMake(self.view.frame.width * -1.5, self.view.frame.height * 0.5)
scrollView.addSubview(containerView)
view.addSubview(scrollView)
self.scrollView.delaysContentTouches = false
I have 3 textfields named search 1, 2, 3 that I then position within this scrollview like this so they are at different lengths off the screen to the LEFT -
search3.center = CGPointMake(screenSize.width * 0.5, screenSize.height * 0.45)
search2.center = CGPointMake(screenSize.width * -0.5, screenSize.height * 0.45)
search1.center = CGPointMake(screenSize.width * -1.5, screenSize.height * 0.45)
This has worked, meaning I have the first search field 2 views to the left, the other right next to it, etc
Problem is I can only scroll to the RIGHT because I can't seem to move the center of my scrollview off the left so its length expands 3 views to the right. I have tried with this -
scrollView.center = CGPointMake(self.view.frame.width * -1.5, self.view.frame.height * 0.5)
And various other methods creating the view programmatically but it sint working. This is what I get with all the things I need to scroll to far to the right -
Ive never had this. How can I make it expand the views width to the left?
Have you tried setting the scrollView's contentOffset? According to the docs, contentOffset represent:
The point at which the origin of the content view is offset from the origin of the scroll view.
If you want your scrollview to start in the middle (can scroll to the left and right) this might work for you with assumption contentView is 3 times the size of the scrollView
self.scrollView.contentOffset = CGPointMake(self.scrollView.contentSize.width/3 , 0.0f);

Setting Origin of Animation to center of View

I have an animation that I'm trying to position in the center of the view. Here's my current code set at static values:
imageViewAnimatedFrame.origin.x = 10
imageViewAnimatedFrame.origin.y = 200
imageViewAnimatedFrame.size.height = 298
imageViewAnimatedFrame.size.width = 391
I'm pretty new to Swift. Is there a way to set the origin x and y to the center subtracted by half the width and height so it lays in the center?
Thanks!
You can do something like this,
let imageViewAnimatedFrame: UIImageView = UIImageView()
imageViewAnimatedFrame.frame = CGRectMake((self.view.frame.size.width / 2) - 159.5, (self.view.frame.size.height / 2) - 149, 391, 298)
Divide view's height and width by 2 and divide your imageview's height and width by 2. then subtract half width of imageview from half width of view as position x and same for position y consider height here.
this way your imageview always be in center.
Hope this will help :)
If you have an ImageView of these dimensions:
imageViewAnimatedFrame.size.height = 298
imageViewAnimatedFrame.size.width = 391
imageViewAnimatedFrame.frame = CGRectMake((self.view.frame.size.width -
imageViewAnimatedFrame.frame.size.width) / 2,
(self.view.frame.size.height -
imageViewAnimatedFrame.frame.size.height) / 2,
imageViewAnimatedFrame.frame.size.width, imageViewAnimatedFrame.frame.size.height);

Centering coordinate origin of UIView

I have a unique requirement to set the coordinate origin of a UIView to be the center of the view. To clarify, the origin needs to be centered vertically and horizontally so that moving to the right is a positive X value, moving left is negative. For Y, moving above the center mark is positive, below is negative. This is essentially the same as geographic coordinates, using the prime meridian's intersection with the equator as the origin.
I am not even sure where to start with this. Can anyone offer up a hint? Thanks, V
Set the origin of the views bounds property to be the middle of the view, something like:
CGRect bounds = view.frame;
bounds.origin.x = bounds.size.width / -2.;
bounds.origin.y = bounds.size.height / -2.;
view.bounds = bounds;
You need functions to transform normal coordinates to strange and vice versa.
For example method in your UIView subclass
- (CGPoint)normalToStrange:(CGPoint)normal
{
return CGPointMake(normal.x - self.width / 2, -normal.y + self.height / 2);
}

How to set a UIView's origin reference?

I am creating a UIImageView and adding it in a loop to my view, I set the initial frame to 0,0,1,47 and each passage of the loop I change the center of the image view to space them out.
I am always using 0 as the origin.y
The problem is the origin reference is in the centre of the image view, assuming we was in interface builder, this is equivalent to the image below.
How can I change the reference point in code ?
After reading these answers and your comments I'm not really sure what is your point.
With UIView you can set position by 2 ways:
center – It definitely says it is the center.
frame.origin – Top left corner, can't be set directly.
If you want the bottom left corner to be at x=300, y=300 you can just do this:
UIView *view = ...
CGRect frame = view.frame;
frame.origin.x = 300 - frame.size.width;
frame.origin.y = 300 - frame.size.height;
view.frame = frame;
But if you go one level deeper to magical world of CALayers (don' forget to import QuartzCore), you are more powerful.
CALayer has these:
position – You see, it don't explicitely says 'center', so it may not be center!
anchorPoint – CGPoint with values in range 0..1 (including) that specifies point inside the view. Default is x=0.5, y=0.5 which means 'center' (and -[UIView center] assumes this value). You may set it to any other value and the position property will be applied to that point.
Example time:
You have a view with size 100x100
view.layer.anchorPoint = CGPointMake(1, 1);
view.layer.position = CGPointMake(300, 300);
Top left corner of the view is at x=200, y=200 and its bottom right corner is at x=300, y=300.
Note: When you rotate the layer/view it will be rotated around the anchorPoint, that is the center by default.
Bu since you just ask HOW to do specific thing and not WHAT you want to achieve, I can't help you any further now.
The object's frame includes its position in its superview. You can change it with something like:
CGRect frame = self.imageView.frame;
frame.origin.y = 0.0f;
self.imageView.frame = frame;
If I am understanding you correctly, you need to set the frame of the image view you are interested in moving. This can be done in the simple case like this:
_theImageView.frame = CGRectMake(x, y, width, height);
Obviously you need to set x, y, width, and height yourself. Please also be aware that a view's frame is in reference to its parent view. So, if you have a view that is in the top left corner (x = 0, y = 0), and is 320 points wide and 400 points tall, and you set the frame of the image view to be (10, 50, 100, 50) and then add it as a subview of the previous view, it will sit at x = 10, y = 50 of the parent view's coordinate space, even though the bounds of the image view are x = 0, y = 0. Bounds are in reference to the view itself, frame is in reference to the parent.
So, in your scenario, your code might look something like the following:
CGRect currentFrame = _theImageView.frame;
currentFrame.origin.x = 0;
currentFrame.origin.y = 0;
_theImageView.frame = currentFrame;
[_parentView addSubview:_theImageView];
Alternatively, you can say:
CGRect currentFrame = _theImageView.frame;
_theImageView.frame = CGRectMake(0, 0, currentFrame.size.width, currentFrame.size.height);
[_parentView addSubview:_theImageView];
Either approach will set the image view to the top left of the parent you add it to.
I thought I would take a cut at this in Swift.
If one would like to set a views position on the screen by specifying the coordinates to an origin point in X and Y for that view, with a little math, we can figure out where the center of the view needs to be in order for the origin of the frame to be located as desired.
This extension uses the frame of the view to get the width and height.
The equation to calculate the new center is almost trivial. See the below extension :
extension CGRect {
// Created 12/16/2020 by Michael Kucinski for anyone to reuse as desired
func getCenterWhichPlacesFrameOriginAtSpecified_X_and_Y_Coordinates(x_Position: CGFloat, y_Position: CGFloat) -> CGPoint
{
// self is the CGRect
let widthDividedBy2 = self.width / 2
let heightDividedBy2 = self.height / 2
// Calculate where the center needs to be to place the origin at the specified x and y position
let desiredCenter_X = x_Position + widthDividedBy2
let desiredCenter_Y = y_Position + heightDividedBy2
let calculatedCenter : CGPoint = CGPoint(x: desiredCenter_X, y: desiredCenter_Y)
return calculatedCenter // Using this point as the center will place the origin at the specified X and Y coordinates
}
}
Usage as shown below to place the origin in the upper left corner area, 25 pixels in :
// Set the origin for this object at the values specified
maskChoosingSlider.center = maskChoosingSlider.frame.getCenterWhichPlacesFrameOriginAtSpecified_X_and_Y_Coordinates(x_Position: 25, y_Position: 25)
If you want to pass a CGPoint into the extension instead of X and Y coordinates, that's an easy change you can make on your own.

Scale a UIView Horizontally

I'm trying to scale a view Horizontally but i'm not getting the results i expected.
view.bounds = CGRectMake(view.bounds.origin.x, view.bounds.origin.y , view.bounds.size.width * scaleX, view.bounds.size.height );
view.center = CGPointMake(view.bounds.origin.x, view.center.y);
As you can see at the code above, i want to scale the view just to the right side. This is why i changed the center of the view.
The problem is that the view stills scaling to both sides!
I did the same logic to scale another UIView vertically and got the result i expected.
Just found the problem.
when setting certer, the new point must be relative to frame, not bounds.
so, i get the code:
view.center = CGPointMake(-view.frame.origin.x, view.center.y);
Hope it helps somebody..
Thx for help
If the origin of your view's frame is in the top-left (which is the default), increasing the width of your view should scale it to the right only.
This should work:
view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y, view.frame.size.width * scaleX, view.frame.size.height);
You do not need to adjust the origin/center point to scale only to the right.
Try using an affine transform instead:
view.transform = CGAffineTransformMakeScale(scaleX, 1)
And then setting the center.

Resources