I have a custom Inventory GUI I'm making but I'm running across some issues during the development. Here is my current problem though; I want user to be able to drag and drop items to new slots in their inventory and organize it to their own style. I decided to use roblox's open source collision detection for GUI's but it does not appear to be working.

Info: all these things are located in multiple Frames in a ScreenGUI. FILTERING ENABLED is true (I don't think this will effect your answer but please keep this in mind).

If you are still confused or don't understand my question just message my roblox account or leave a comment. My apologies if this does not make any sense, I'm not the best at explaining.

I am currently messing with this but I wanted to hear what others had to say, thanks!

The code (in a localscript obv)

repeat wait() until game.Players.LocalPlayer
--------------------------------------------------------
--Variables
--------------------------------------------------------
local StarterGui = game:GetService('StarterGui')
local Player = game.Players.LocalPlayer
local inventory = script.Parent.Inventory
local hotbar = script.Parent.HotBar
--------------------------------------------------------
-- Startup process
-------------------------------------------------------- 
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Health, false)
StarterGui:SetCoreGuiEnabled(Enum.CoreGuiType.Backpack, false)

inventory.Visible = false
hotbar.Visible = true
-------------------------------------------------------
--Bman's Sexy Inventory API
-------------------------------------------------------
function sortInv()
	print("sorting")

	for _,item in pairs (script.Parent.items:GetChildren()) do
		for _,slot in pairs (script.Parent.Inventory:GetChildren()) do
			print(slot.Name)
			if (slot.Name ~= "INFO") and (slot.ClassName == "Frame") and (slot.containsItem.Value == false) then
				print(slot.Name)				
				slot.containsItem.Value = true
				local cloneItem = item:Clone()
				cloneItem.Parent = slot
				break
			end
		end
	end
end

function returnItemsInInv()
	local items = {}
	for _,slot in pairs (script.Parent.Inventory:GetChildren()) do
		if (#slot:getChildren() > 1) then
			for _,item in pairs (slot:getChildren()) do
				if (item.ClassName == "ImageLabel") then
					local num = table.maxn(items)
					table.insert(items, num, item)
				end
			end
		end
	end
	return items
end

function checkCollision(gui)
	local items = returnItemsInInv()
	for _, gui2 in pairs (script.Parent.Inventory:GetChildren()) do
		print(gui2.Name)
		if (gui2.Name == "INFO") then
			break
		end
		if gui.Position.Y.Scale<gui2.Position.Y.Scale+gui2.Size.Y.Scale and
        	gui.Position.Y.Scale>gui2.Position.Y.Scale-(gui2.Size.Y.Scale/2) and
        	gui.Position.X.Scale<gui2.Position.X.Scale+gui2.Size.X.Scale and
        	gui.Position.X.Scale+gui.Size.X.Scale>gui2.Position.X.Scale then
         	--Downward edge collide
         	gui.Position=UDim2.new(gui2.Position)
			gui.Parent = gui2
			print("boom 1")
			return
     	end
     	if gui.Position.Y.Scale+gui.Size.Y.Scale>gui2.Position.Y.Scale and
        	gui.Position.Y.Scale+gui.Size.Y.Scale<gui2.Position.Y.Scale+(gui2.Size.Y.Scale/2) and
        	gui.Position.X.Scale<gui2.Position.X.Scale+gui2.Size.X.Scale and
        	gui.Position.X.Scale+gui.Size.X.Scale>gui2.Position.X.Scale then
        	-- Upward edge collide
         	gui.Position=UDim2.new(gui2.Position)
			gui.Parent = gui2.Parent
			print("boom 2")
			return
     	end
     	if gui.Position.X.Scale+gui.Size.X.Scale>gui2.Position.X.Scale and
        	gui.Position.X.Scale+gui.Size.X.Scale<gui2.Position.X.Scale-(gui2.Size.X.Scale/2) and
        	gui.Position.Y.Scale<gui2.Position.Y.Scale+gui2.Size.Y.Scale and
        	gui.Position.Y.Scale+gui.Size.Y.Scale>gui2.Position.Y.Scale then
         	-- Left edge collide
        	gui.Position=UDim2.new(gui2.Position)
			gui.Parent = gui2.Parent
			print("boom 3")
			return
     	end
    	if gui.Position.X.Scale<gui2.Position.X.Scale+gui2.Size.X.Scale and
        	gui.Position.X.Scale>gui2.Position.X.Scale+(gui2.Size.X.Scale/2) and
        	gui.Position.Y.Scale<gui2.Position.Y.Scale+gui2.Size.Y.Scale and
        	gui.Position.Y.Scale+gui.Size.Y.Scale>gui2.Position.Y.Scale then
         	-- Right edge collide
        	gui.Position=UDim2.new(gui2.Position)
			gui.Parent = gui2.Parent
			print("boom 4")
			return
    	end
	end
	
end

sortInv() --TEMPORARY
-------------------------------------------------------
--Keyboard Input
-------------------------------------------------------
local Mouse = Player:GetMouse()
 
Mouse.KeyDown:connect(function(Key)
    print(("The '%s' key was pressed"):format(Key))
	if (Key == "e") then
		if (inventory.Visible == false) then
			inventory.Visible = true
		elseif (inventory.Visible == true) then
			inventory.Visible = false
		end
	end
end)
-------------------------------------------------------
--Dragging items
-------------------------------------------------------
while true do
	local items = returnItemsInInv()
	for _,item in pairs (items) do
		item.DragStopped:connect(function(X, Y)
    		print(("The player stopped dragging the GuiObject at (%i, %i)"):format(X, Y))
			checkCollision(item)
		end)
	end
	wait()
end